delete了,析构函数却没有调用 (二)

2014-11-23 23:21:19 · 作者: · 浏览: 13
his->pTestA = pTestA;
}

CTestApp::~CTestApp()
{
delete pTestA;
qDebug() << "~CTestApp()";
}

CTestApp::CTestApp(CTestA *pTestA)
{
this->pTestA = pTestA;
}

CTestApp::~CTestApp()
{
delete pTestA;
qDebug() << "~CTestApp()";
}

[html]
main.cpp文件
#include "testb.h"
#include "testcpp.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
CTestB *pTestB = CTestB::getInstance();
CTestApp *pTestApp = new CTestApp(pTestB->getTestA());
delete pTestApp;
return app.exec();
}

main.cpp文件
#include "testb.h"
#include "testcpp.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
CTestB *pTestB = CTestB::getInstance();
CTestApp *pTestApp = new CTestApp(pTestB->getTestA());
delete pTestApp;
return app.exec();
}下面是输出结果,

~CTestApp()

说明delete pTestA;后没有调用pTestA的析构函数,当把testapp.cpp文件的//#include "testa.h"注释取消,delete后会调用pTestA析构函数,这是去掉注释后的输出结果:


~CTestA()

~CTestApp()

注以上的编译环境是ming32-make,不知道其他的编译环境会不会出现如此问题,这个留给大家去验证。
下面是反汇编代码,这是在testapp.cpp里面加了testa.h的delete pTestA反汇编代码:


delete pTestA;0x0040255c <+8>: mov 0x8(%ebp),%eax0x0040255f <+11>: mov (%eax),%ebx0x00402561 <+13>: test %ebx,%ebx0x00402563 <+15>: je 0x402575 <~CTestApp+33>0x00402565 <+17>: mov %ebx,(%esp)0x00402568 <+20>: call 0x403082 <~CTestA>0x0040256d <+25>: mov %ebx,(%esp)0x00402570 <+28>: call 0x40aa68 <_ZdlPv>


这是这是在testapp.cpp里面没有加testa.h的delete pTestA反汇编代码:


delete pTestA;0x00402550 <+8>: mov 0x8(%ebp),%eax0x00402553 <+11>: mov (%eax),%eax0x00402555 <+13>: mov %eax,(%esp)0x00402558 <+16>: call 0x40aa48 <_ZdlPv>可以看到加了testa.h的反汇编中,调用了析构函数~CTestA, call 0x403082 <~CTestA>