我有这个代码:
class Class {
public:
virtual ~Class() {}
};
int main()
{
Class* object = new Class();
delete object;
}
我用 Visual C++ 10 进行编译并得到这个反汇编delete object
陈述:
delete object;
test eax,eax
je wmain+23h (401041h)
mov edx,dword ptr [eax]
push 1
mov ecx,eax
call dword ptr [edx]
对于实际的析构函数来说:
Class::`scalar deleting destructor':
test byte ptr [esp+4],1
push esi
mov esi,ecx
mov dword ptr [esi],offset Class::`vftable' (402100h)
je Class::`scalar deleting destructor'+18h (401018h)
push esi
call dword ptr [__imp_operator delete (4020A8h)]
pop ecx
mov eax,esi
pop esi
ret 4
那是什么push 1
在调用站点做什么以及为什么test
在析构函数入口点检查该值并有条件地绕过调用operator delete()
?
析构函数使用该参数来了解是否应该在最后调用delete。
3种你不想调用它的情况:
- 析构函数由派生类析构函数调用
- 该对象是在堆栈上分配的,因此不是用 new 创建的。
- 该对象是另一个对象的字段,因此不是由 new 创建的
编辑:添加第三种情况
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)