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

2023-12-22

我有这个代码:

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(使用前将#替换为@)

传递给虚拟析构函数的这个额外参数是什么? 的相关文章

随机推荐