我有这段代码:
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()
的呼叫?
答案 0 :(得分:14)
析构函数使用该参数来知道它是否应该在最后调用delete。
3个你不想打电话的案例:
编辑:添加第三个案例
答案 1 :(得分:5)
我相信额外的参数告诉编译器哪个析构函数是派生最多的析构函数,因此它只在适当的继承级别释放一次内存。如果我没记错的话,我在gcc中看到了类似的东西。
答案 2 :(得分:5)
基本上,虚析构函数也实现了调用操作符delete。参数用于决定是否调用它。
请参阅this answer that shows the meaning of such hidden destructor parameter。