【发布时间】:2011-12-24 12:39:12
【问题描述】:
我有这个代码:
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() 的调用?
【问题讨论】:
-
我建议你把它标记为
c++-cli -
@Gorpik 但它不是 c++-cli,我不认为
-
对,但这是Debug项目配置还是Release?
-
@ThomasMcLeod 您被明确允许调用
delete null;,并且new有可能返回空值,因此可能不允许对其进行优化。 -
@Rup: 没错,除了
new永远不会返回null,但 Visual C++ 仍然会检查。
标签: c++ visual-c++ virtual-destructor