在C ++中调用哪个析构函数?

时间:2010-12-22 10:46:18

标签: c++ destructor

我正在寻找程序中的内存泄漏。

我把它缩小到一些没有被召唤的破坏者。但是,我无法弄清楚原因:

class CMain : public CList {
public:
    CMain();
    virtual ~CMain();
    ...
}

class CList : public CProc {
public:
    CList();
    virtual ~CList();
    ...
}

/* some code and a main func here */
CMain *pMain = new CMain();
/* some more code here */
delete pMain;

CMain被解除分配,但~CList()永远不会被调用。 CList的所有父类也都有虚拟析构函数。

您是否有任何关于为什么永远不会调用CList的析构函数的提示?

5 个答案:

答案 0 :(得分:3)

你能在~CMain中设置断点以查看它的位置吗?

答案 1 :(得分:2)

也许在某处有切片问题。只是猜猜..

What is object slicing? 不,这不是那种情况。

你shuld在~CMain中放了一个try catch块,嗯,其中一个成员在析构函数中抛出一个异常?

答案 2 :(得分:1)

因为您没有delete分配了new的对象。

- )

更严重的是,你是否已经调试了一个CList的范围的理论结束,并进入其破坏过程,会发生什么?

答案 3 :(得分:0)

  

CMain被解除分配就好了,但是~CList()从未被调用过。

这听起来像是一个错误的陈述。如果调用了~CMain,那么最终也会调用~CList,因为它是基类。检查如何检测是否调用析构函数。

当你说“CMain被取消分配”时,你的意思是说你发出delete吗?检查您执行delete pMain时,CMain的类定义是否可见。在没有定义的情况下,允许编译器假定类没有用户定义的或虚拟的析构函数,并且可以省略调用它。

答案 4 :(得分:0)

孩子,然后是父母。但在他们之间,孩子的属性被破坏了。我建议看看~CMain是否运行到最后 - 如果确实如此,并且~CList永远不会进入,你就会遇到CMain的一个属性问题。

只是为了证明:

#include <iostream>
#include <stdlib.h>

struct Owned {
    ~Owned() {
        std::cerr << "~Owned" << std::endl;
        exit(1);
    }
};

struct Parent {
    virtual ~Parent() {
        std::cerr << "~Parent" << std::endl;
    }
};

struct Owner : public Parent {
    ~Owner() {
        std::cerr << "~Owner" << std::endl;
    }

    Owned owned;
};

int main()
{
    Owner owner;
    return 0;
}

输出:

~Owner
~Owned

并以退货代码1退出。