5

GCC によって生成された仮想デストラクタのコードを (-fdump-tree-original を使用して) ダンプすると、次のようになります。

;; Function virtual Foo::~Foo() (null)
;; enabled by -tree-original

{
  <<cleanup_point <<< Unknown tree: expr_stmt
  (void) (((struct Foo *) this)->_vptr.Foo = &_ZTV3Foo + 8) >>>
>>;
}
<D.20148>:;
if ((bool) (__in_chrg & 1))
  {
    <<cleanup_point <<< Unknown tree: expr_stmt
  operator delete ((void *) this) >>>
>>;
  }

私の質問は: " <D.20148>:;" の後のコードはどこにありますか? デストラクタの外にあるので、このコードはいつ実行されますか?

4

1 に答える 1

5

これは、デストラクタが呼び出された後に実際のメモリ割り当て解除を管理するためにコンパイラが生成したコードのように見え、デストラクタ コードの直後に実行する必要があります。

于 2010-04-24T00:12:31.070 に答える