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

What's this extra parameter passed into virtual destructor?

本文关键字:参数 是什么 虚拟 析构函数      更新时间:2023-10-16

我有这样的代码:

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
  • 创建的。

编辑:添加第三个大小写

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

请参阅下面的答案,该答案显示了该隐藏析构函数形参的含义。

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