64,642
社区成员
发帖
与我相关
我的任务
分享
#include "stdafx.h"
class A {
public:
A() {
m_pBuf = new int[10];
}
~A() {
__asm mov eax,[ebp];//取父函数的帧指针
__asm test [eax+8],1;//比较父函数的参数(VC6下是+8,其它未试验)
__asm jz _l_kill_this;//0表示直接调用了析构函数,转自杀流程
delete[]m_pBuf;//如果正常调用delete过来的,走正常析构流程
return;
_l_kill_this:
delete this;//自杀
}
int* m() {
return m_pBuf;
}
int n(int i) {
return m_pBuf[i];
}
private:
int* m_pBuf;
};
const int NOT_USE_DELETE = 1;
int main(void)
{
try {
A* pA = new A;
if (NOT_USE_DELETE) {
printf("直接调用析构函数\n");
pA->~A();
}
else {
printf("正常调用delete方法\n");
delete pA;
}
}
catch(...) {
printf("抛出例外\n");
}
getchar();
return 0;
}