私はこのようなステートメントをたくさん含む他の誰かのコードに取り組んでいます
std::auto_ptr<ObjectA> smartptr(new ObjectA(this));
objects_list.push_back(smartptr.get());
smartptr.release();
これも役に立ちますか?書くだけでなく、ここでスマートポインターを使用する実用的な理由はありますか
objects_list.push_back(new ObjectA(this));
私はこのようなステートメントをたくさん含む他の誰かのコードに取り組んでいます
std::auto_ptr<ObjectA> smartptr(new ObjectA(this));
objects_list.push_back(smartptr.get());
smartptr.release();
これも役に立ちますか?書くだけでなく、ここでスマートポインターを使用する実用的な理由はありますか
objects_list.push_back(new ObjectA(this));
objects_list.push_back(new ObjectA(this));
これにより、メモリ リークが発生する可能性があります。分解するとどうなるか見てみましょう。
new ObjectA(this)
割り当てられますpush_back
次に呼び出されますただし、push_back
投げられたら、あなたnew ObjectA
は漏れます。
あなたが私たちに示したauto_ptr
コードはこの問題を解決しpush_back
ますauto_ptr
。
本当の解決策は、ネイキッド ポインターではなく、スマート ポインターをコンテナーに直接格納することです (コンテナー内のネイキッド ポインターは、オブジェクトが正しく削除されることを確認する上で頭痛の種になるため)。
残念ながら、C++03 (これがauto_ptr
由来であり、C++11 では廃止されました) では、これauto_ptr
をコンテナーに格納することはできません (パターンがひどく壊れています)。コンテナに保存boost::shared_ptr
するか、C++11 に切り替えて または のいずれかを保存するunique_ptr
ことができshared_ptr
ます。
push_back
おそらく、ベクトルがスローされた場合にメモリリークを防ぐという考えでした。これは、ベクトルを再配置する必要があり、より多くのメモリを割り当てることができない場合に発生する可能性があります。
例外安全性を提供します。push_back
最初の例では、割り当てられたオブジェクトは失敗すると削除されます。2 番目の例では、リークします。
2011 年以降、auto_ptr
が推奨されなくなりましたunique_ptr
。これには、ベクターに格納できるという利点があり、ベクターからオブジェクトを削除するときにオブジェクトを手動で削除する負担が軽減されます。