クラスで宣言された構造体のベクトルがあります。私の質問は、クラス デストラクタでベクトルによって割り当てられたメモリを明示的に解放する必要があるのか、それともインスタンスを破棄するときに自動的に解放されるのかということです。同様に、ベクトルのメモリを解放するために、クラス デストラクタにコードを含める必要がありますか。
3 に答える
を使用して自分で構造体を割り当てている場合は、使用が終了したら、new
を使用してそれらの割り当てを解除する必要があります。あなたのためにそれをしません。delete
std::vector
『 Effective C++』(強く推奨)の項目 13 には、オブジェクトを使用してリソースを管理することが記載されています。これにより、例外がスローされたなどの理由で、リソースの割り当て解除コードが呼び出されないことを心配する必要があるなどの問題を回避できます。C++11 を使用している場合は、shared_ptrを調べるか、独自のリソース管理クラスを作成できます。
更新: jogojapan が指摘したように、std::auto_ptr は STL コンテナーには適していません。
独自のデストラクタがあるかどうかに関係なく: クラスのすべてのメンバーには、そのデストラクタが呼び出されます (覚えておいてください: メンバーがポインタであり、メモリを手動で割り当てた場合は、デストラクタ本体で割り当てられたメモリを解放する必要があります。ポインターを破棄しますが、ポインターが指すメモリの割り当てを解除しません)。
C++ 標準では、デストラクタ本体の後に、すべての非バリアント非静的データ メンバーのデストラクタが呼び出されると述べています。