デストラクターを手動で呼び出すのはどのような場合に正当化されますか?
デストラクターを手動で呼び出すことは設計に欠陥があることを示すという考えがよく主張されます。ただし、これには疑問が生じます: このルールには例外はありますか?
反例: 手動デストラクター呼び出しが必要なケース
確かに、それが必要になる状況があります。デストラクターを明示的に呼び出すには:
1。制御されたメモリ割り当て解除:
メモリ割り当てと割り当て解除がオブジェクトの構築と破棄とは独立して管理される場合、手動のデストラクタ呼び出しが重要になります。このような場合、オブジェクトの構築は既存のメモリ バッファに新規に配置することで行われ、破棄は明示的なデストラクタ呼び出しによって行われます。 { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); }
char buffer[sizeof(MyClass)]; { MyClass* p = new(buffer)MyClass; p->dosomething(); p->~MyClass(); }2.特定のメモリ アロケータ:
別の例は、std::vector によるデフォルトの std::allocator の使用法です。ここで、要素はプッシュバック操作中に構築されますが、メモリ割り当ては要素の構築より前のチャンクで発生します。そのため、特にさらなるプッシュバックが差し迫っている場合、vector::erase は必ずしもメモリの割り当てを解除せずに要素を破棄する必要があります。
影響:デストラクターを手動で呼び出すと厳密に違反する可能性があります。オブジェクト管理とメモリ管理の間の境界線を曖昧にすることによる OOP 原則。ただし、メモリの割り当てと割り当て解除が分離されている低レベルのプログラミングやシナリオでは、これが適切な場合があります。
さらに、ランダムな手動デストラクター呼び出しは設計上の問題を示している可能性がありますが、専用クラス内での局所的な使用は問題がある可能性があります。健全な練習を考慮しました。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3