new
標準の/を使用delete
するだけでは不十分で、明示的にデストラクタを呼び出す必要がある状況はありpA->~A()
ますか?
一部のリソース管理クラスでのみ必要だと思いますが、通常は悪い考えです。デストラクタはスコープの最後で自動的に呼び出されますが、なぜ自分で明示的に呼び出す必要があるのでしょうか?
例を使った説明は素晴らしいでしょう!
new
標準の/を使用delete
するだけでは不十分で、明示的にデストラクタを呼び出す必要がある状況はありpA->~A()
ますか?
一部のリソース管理クラスでのみ必要だと思いますが、通常は悪い考えです。デストラクタはスコープの最後で自動的に呼び出されますが、なぜ自分で明示的に呼び出す必要があるのでしょうか?
例を使った説明は素晴らしいでしょう!
union
C++11 では、デストラクタを必要とする with 型を使用できます。コンパイラは現在アクティブな型を追跡しないため、現在アクティブなメンバーを置き換えるとき、またはunion
.
9.5 [class.union] パラグラフ 4 では、標準は次のサンプル コードを使用して、現在アクティブなメンバーm
から新しくアクティブなメンバーに切り替えn
ます。
u.m.~M();
new (&u.n) N;
明示的なデストラクタ呼び出しが使用される別のインスタンスは、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
カスタムのデリータと一緒に使用する方が適切です。)