Windows MS VC++ 2005 上的 CRT 堆调试



我启用了堆调试,因为我开始在别人的代码中看到内存泄漏错误,我将问题(至少,我认为)固定到类的析构函数,就在调用下面的delete []之后。

MyClass::~MyClass() {
    delete [] my_class_member_;
}

现在我确认my_class_member_,这是一个指向结构(例如MyStruct)对象的指针数组,已使用new []分配了属性,所以我不确定是什么导致了此泄漏?以下是new []调用的外观:

delete [] my_class_member_;
my_class_member_ = new MyStruct[somesize_]; 

接下来,结构MyStruct也比较简单,如下(剥离):

struct MyStruct {
    MyStruct() {}
    ~MyStruct() {
        for( PtrList<PClass>::iterator it(ps); it.more(); it.next() ) {
            delete it.cur();
        }
        for( PtrList<RClass>::iterator it(rs); it.more(); it.next() ) {
            delete it.cur();
        }
        delete shift;
    }
    PtrList<PClass> ps;
    PtrList<RClass> rs;
};

现在PtrList是一个指针列表(我们正在使用的应用程序开发工具包的内置类型)。我很确定这不会有错。无论如何,这里有人注意到什么不正常的地方吗?欣赏任何见解..

根据 OP 的要求添加注释作为答案。

你遵循三法则吗?
从您提供的信息来看,尚不清楚您是否这样做。您需要提供一个复制构造函数和复制赋值运算符,用于对动态分配的成员进行深层复制。如果您不这样做,并且如果这两个运算符都没有private并且没有未定义,那么您无法确定它们根本没有被使用,这就是您的问题所在

最新更新