私はこのコードを持っています:
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()
なぜですか?