仮想デストラクタを使用して、モジュールAで作成されたオブジェクトをモジュールBから削除しても安全かどうかを判断しようとしています。
MS C ++コンパイラを使用する場合、仮想デストラクタを持つオブジェクトを削除すると、vtable呼び出しが1つだけになり、基になるfree()
呼び出しがその内部で実行されます(つまり、オブジェクトを作成したのと同じモジュールで、つまり安全です)。
質問は次のとおりです。それは現在のMS実装だけですか、それとも何らかの標準またはドキュメントで保証されており、安全に信頼できますか?
VS2010での逆アセンブルされた仮想デストラクタ呼び出しの例を次に示します。
int _tmain(int argc, _TCHAR* argv[])
{
test *p = new test();
008A1030 push 4
008A1032 call dword ptr [__imp_operator new (8A20A0h)]
008A1038 add esp,4
008A103B test eax,eax
008A103D je wmain+19h (8A1049h)
008A103F mov dword ptr [eax],offset test::`vftable' (8A2100h)
008A1045 mov ecx,eax
008A1047 jmp wmain+1Bh (8A104Bh)
008A1049 xor ecx,ecx
__asm int 3;
008A104B int 3
delete p;
008A104C test ecx,ecx
008A104E je wmain+28h (8A1058h)
008A1050 mov eax,dword ptr [ecx]
008A1052 mov edx,dword ptr [eax]
008A1054 push 1
008A1056 call edx
__asm int 3;
008A1058 int 3
return 0;
008A1059 xor eax,eax
}