传递到虚拟析构函数的这个额外参数是什么?
What's this extra parameter passed into 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()
的调用?
析构函数使用该实参来判断是否应该在末尾调用delete。
3种不需要调用的情况:
- 析构函数由派生类析构函数调用。
- 对象是在栈上分配的,因此不是用new创建的。
- 对象是另一个对象的字段,因此不是由new 创建的。
编辑:添加第三个大小写
基本上,虚析构函数还实现了调用操作符delete。参数的作用是决定是否调用它
请参阅下面的答案,该答案显示了该隐藏析构函数形参的含义。
我认为额外的形参告诉编译器哪个析构函数是派生最多的,因此它只在适当的继承级别上释放一次内存。如果我没记错的话,我在gcc中见过类似的东西。
相关文章:
- 通过引用函数传递指针参数是什么意思?
- FFT函数的参数是什么意思
- v8 源代码中 ArrayMap 函数的回调 fn 参数是什么?
- 这个奇怪的函数参数是什么?
- 这个函数的参数是什么?
- OpenGL 调试 错误回调函数的 ID 参数是什么?
- 操作员[]作为成员函数的正确模板参数/参数是什么?
- 这个 lambda 的参数是什么类型?
- 函数upper_bound的参数是什么
- mpi_scatterv中的显示参数是什么?
- 这些额外的参数是什么意思
- ON_LBN_SELCHANGE的参数是什么
- 默认参数模板与可变参数模板:最后一个模板参数是什么
- D3DX11CompileFromFile中的第四个参数是什么
- 在 JavaCV 中传递给 cvFindContours() 的参数是什么?
- 这个向量类中的参数是什么
- fcntl() 中的第三个参数是什么
- 参数是什么意思
- std::vector.resize()中的第二个参数是什么意思
- 此签名中的第二个参数是什么意思