什么是这个额外的参数传递到虚拟析构函数?

时间:2011-11-08 14:43:07

标签: c++ visual-c++ virtual-destructor

我有这段代码:

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()的呼叫?

3 个答案:

答案 0 :(得分:14)

析构函数使用该参数来知道它是否应该在最后调用delete。

3个你不想打电话的案例:

  • 析构函数由派生类析构函数
  • 调用
  • 对象在堆栈上分配,因此不是用new创建的。
  • 该对象是另一个对象的字段,因此不是由新
  • 创建的

编辑:添加第三个案例

答案 1 :(得分:5)

我相信额外的参数告诉编译器哪个析构函数是派生最多的析构函数,因此它只在适当的继承级别释放一次内存。如果我没记错的话,我在gcc中看到了类似的东西。

答案 2 :(得分:5)

基本上,虚析构函数也实现了调用操作符delete。参数用于决定是否调用它。

请参阅this answer that shows the meaning of such hidden destructor parameter