派生类内存泄漏

时间:2015-04-12 04:34:03

标签: c++

我正在试图找出我所拥有的内存泄漏。

我有这些(简化的)类(无法更改,我必须使用这些):

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也存在。也许我选择了简单的例子。

2 个答案:

答案 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已初始化。

但这可能取决于您的示例代码是否不完整。