1. ホーム
  2. c++

[解決済み] デストラクタを手動で呼び出すことは、常に悪い設計の兆候なのでしょうか?

2023-03-23 23:07:01

質問

デストラクタを手動で呼び出している場合、何か間違ったことをしているのではと言われています。しかし、それは常にそうなのでしょうか?反例はありますか?手動で呼び出すことが必要な状況、またはそれを避けることが難しい/不可能/非現実的な状況ですか?

どのように解決するのですか?

のオーバーロードされたフォームを使用してオブジェクトが構築された場合、手動でデストラクタを呼び出す必要があります。 operator new() を使用した場合を除き、手動でデストラクタを呼び出す必要があります。 std::nothrow "オーバーロードを使用する場合を除きます。

T* t0 = new(std::nothrow) T();
delete t0; // OK: std::nothrow overload

void* buffer = malloc(sizeof(T));
T* t1 = new(buffer) T();
t1->~T(); // required: delete t1 would be wrong
free(buffer);

外では、上記のようにかなり低いレベルでメモリを管理していますが、明示的にデストラクタを呼び出しています。 は悪い設計のしるしです。おそらく、単に設計が悪いというだけでなく、明らかに間違っています (そうです、明示的なデストラクタを使用し、その後に代入演算子のコピー コンストラクタを呼び出すと、その代入演算子は は悪い設計であり、間違っている可能性が高いです)。

C++ 2011 では、明示的なデストラクタ呼び出しを使用する理由がもうひとつあります。一般化された共用体を使用する場合、表現されたオブジェクトの型を変更するときに、現在のオブジェクトを明示的に破棄し、placement new を使用して新しいオブジェクトを作成する必要があります。また、ユニオンを破棄する際、現在のオブジェクトの破棄が必要な場合は、明示的にそのオブジェクトのデストラクタを呼び出す必要があります。