我正在寻找程序中的内存泄漏。
我把它缩小到一些没有被召唤的破坏者。但是,我无法弄清楚原因:
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
的析构函数的提示?
答案 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退出。