手動のデストラクター呼び出しは不適切な設計を示しますか?
手動でのデストラクターの呼び出しは不適切な設計を示すと広く信じられています。ただし、このルールには例外があります。
手動のデストラクター呼び出しが必要になるシナリオの 1 つは、割り当てられたメモリを解放せずにオブジェクトのみを破棄する必要がある場合です。これは通常、メモリの割り当てと割り当て解除がオブジェクトの構築や破棄とは別に処理されるシナリオで発生します。このような場合、オブジェクトは既存のメモリ ブロック上に新しい配置を使用して構築され、デストラクタが手動で呼び出されてオブジェクトを消去します。
次の例を考えてみましょう。
char buffer[sizeof(MyClass)]; { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); } { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); }
別の注目すべきインスタンスでは、手動でデストラクター呼び出しが発生するのは、std::vector で使用されるデフォルトの std::allocator です。要素はプッシュバック中にベクター内で構築されますが、メモリは事前にチャンクに割り当てられます。その結果、vector::erase は、特に Push_back 操作がすぐに予想される場合、基礎となるメモリを必ずしも解放することなく要素を消滅させることができます。
手動デストラクター呼び出しは厳密な OOP 原則から逸脱しますが、メモリ管理が困難な状況では適切である可能性があります。オブジェクトのライフサイクルから独立しています。さらに、そのような目的のために設計されたクラス内でこのアプローチをローカルに実装することは、サウンド デザインとして認定されます。
以上がデストラクターを手動で呼び出すことが適切な設計選択となるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。