我正在试图找出我所拥有的内存泄漏。
我有这些(简化的)类(无法更改,我必须使用这些):
class Base
{
bool baseBool;
Base(Base&){};
virtual ~Base();
}
class Derived1 : public: Base
{
char* text;
Derived1(Derived1&);
~Derived1();
}
class Derived2 : public: Base
{
int num;
Derived2(Derived2&);
~Derived()
}
Derived1复制构造函数
Derived1::Derived1(Derived1& derived):text("")
{
text=new char[strlen(text)+1]; //assign enough memory + 1
strcpy(text,derived.text); //copy existing aText into new objects aText
}
然后我有一个用来操纵它们的结构
struct Container
{
Container& operator=(Container&);
Base** bases
}
在重载的operator = for struct Container中,我正在制作Container对象的深层副本。像这样:
Container& Container::operator=(Container& R)
{
int i,j,k;
for(i=0;i<MAX;i++)
delete bases[i];
delete[]bases;
bases=new Base*[MAX];
for(j=0;j<MAX;j++)
answers[j]=0;
for(k=0;k<MAX;k++)
{
if(dynamic_cast<Derived1 *>(R.bases[k]))
bases[k]=new Derived1(*(dynamic_cast<Derived1 *>(R.bases[k])));
else
bases[k]=new Derived2(*(dynamic_cast<Derived2 *>(R.bases[k])));
}
return *this;
}
如果我使用overloaded = operator
分配新创建的Container对象,则此部分代码可以正常工作就像我的主要
一样Container containers[2];
bases = new Base*[2];
bases[0] = new Derived1("boooo");
bases[1] = new Derived2(3);
containers[0]=*(new Container(bases)); //uses the overloaded operator= OK
但是,如果我要像这样分配两个已经制作的Container对象:
containers[0]=containers[1];
调试后,它崩溃了
for(i=0;i<MAX;i++)
delete bases[i];
说
HEAP[ass3.exe]: Heap block at 00729268 modified at 00729295 past requested size of 25
ass3.exe has triggered a breakpoint.
HEAP[ass3.exe]: Invalid address specified to RtlValidateHeap( 00720000, 00729270 )
ass3.exe has triggered a breakpoint.
这就是为什么我认为我有内存泄漏的原因,因为Derived1有一个char *。
很高兴任何输入。
谢谢!我希望我足够清楚......
编辑:我有一个空的基本拷贝构造函数,派生的cc也存在。也许我选择了简单的例子。
答案 0 :(得分:0)
看起来MAX是一个大于基数的数字,即。 base可能只有5个entrys而MAX可能是10.在这种情况下,一旦你超过了base的结尾(如果大小只有5,则base [5]不存在,因为编号从0开始)。我通常使用向量而不是数组,for循环的代码如下所示:
for(i=0;i<bases.size();i++)
delete bases[i];
这可以确保你的for循环不会超过基数的结尾。
答案 1 :(得分:0)
从这个例子中,你已经确定了你需要确保&#39;基础&#39; struct Container本身的成员实际上是已分配并初始化的。
根据您已表达的症状(在第一次迭代时崩溃),看起来您正在删除未初始化的基指针(指针数组),或者实际指针本身不正确nullptr已初始化。
但这可能取决于您的示例代码是否不完整。