2

仮想デストラクタを使用して、モジュール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  
}
4

1 に答える 1

3

では、呼び出し元はオブジェクトの型を知らないのでしょうか? そして、そのタイプを知らずに、呼び出し元はどのように呼び出すことができますDerived::operator deleteか? ジェネリックの代わりに を呼び出す必要があるかどうかだけDerived::~Derivedを知ることができます。Derived::operator delete::operator delete

したがって、呼び出し元は を呼び出すことができないと推測できます::operator delete

operator deletelater が を呼び出すかどうかは不明free()ですが、とにかく詳細です。

于 2012-08-13T10:55:46.990 に答える