3

new標準の/を使用deleteするだけでは不十分で、明示的にデストラクタを呼び出す必要がある状況はありpA->~A()ますか?

一部のリソース管理クラスでのみ必要だと思いますが、通常は悪い考えです。デストラクタはスコープの最後で自動的に呼び出されますが、なぜ自分で明示的に呼び出す必要があるのでしょうか?

例を使った説明は素晴らしいでしょう!

4

2 に答える 2

7

unionC++11 では、デストラクタを必要とする with 型を使用できます。コンパイラは現在アクティブな型を追跡しないため、現在アクティブなメンバーを置き換えるとき、またはunion.

9.5 [class.union] パラグラフ 4 では、標準は次のサンプル コードを使用して、現在アクティブなメンバーmから新しくアクティブなメンバーに切り替えnます。

u.m.~M();
new (&u.n) N;
于 2013-09-01T00:17:59.150 に答える
6

明示的なデストラクタ呼び出しが使用される別のインスタンスは、placement を使用して手動で構築されたオブジェクトですnew

malloc/互換の API を使用しようとしていたとしfreeます (たとえば、カスタム C スタイルのアロケータを指定できる C クライアントとの対話用):

void* buf = malloc(sizeof (MyType));
if (buf) {
    MyType* foo = new (buf) MyType;
    // ...
    foo->~MyType();
    free(buf);
}

(ただし、この場合は、shared_ptrまたはunique_ptrカスタムのデリータと一緒に使用する方が適切です。)

于 2013-09-01T00:19:12.967 に答える