关于c ++:这个额外的参数传递给虚拟析构函数是什么?

What's this extra parameter passed into virtual destructor?

我有这个代码:

1
2
3
4
5
6
7
8
9
10
class Class {
public:
    virtual ~Class() {}
};

int main()
{
    Class* object = new Class();
    delete object;
}

我用VisualC++ 10编译并获得EDCOX1×0语句的反汇编:

1
2
3
4
5
6
7
delete object;
test        eax,eax  
je          wmain+23h (401041h)  
mov         edx,dword ptr [eax]  
push        1  
mov         ecx,eax  
call        dword ptr [edx]

对于实际的析构函数:

1
2
3
4
5
6
7
8
9
10
11
12
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创建的。
  • 对象是另一个对象的字段,因此不是由新对象创建的

编辑:添加第三个案例


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

请参阅显示此类隐藏析构函数参数含义的答案。


我相信这个额外的参数告诉编译器哪个析构函数是派生的最多的,所以它只在继承的适当级别上释放一次内存。如果我没记错的话,我在海湾合作委员会也看到过类似的情况。