5

私はこのようなステートメントをたくさん含む他の誰かのコードに取り組んでいます

std::auto_ptr<ObjectA> smartptr(new ObjectA(this));
objects_list.push_back(smartptr.get());
smartptr.release();

これも役に立ちますか?書くだけでなく、ここでスマートポインターを使用する実用的な理由はありますか

objects_list.push_back(new ObjectA(this));
4

4 に答える 4

14
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ます。

于 2013-05-22T10:58:56.267 に答える
2

push_backおそらく、ベクトルがスローされた場合にメモリリークを防ぐという考えでした。これは、ベクトルを再配置する必要があり、より多くのメモリを割り当てることができない場合に発生する可能性があります。

于 2013-05-22T10:58:36.350 に答える
1

例外安全性を提供します。push_back最初の例では、割り当てられたオブジェクトは失敗すると削除されます。2 番目の例では、リークします。

2011 年以降、auto_ptrが推奨されなくなりましたunique_ptr。これには、ベクターに格納できるという利点があり、ベクターからオブジェクトを削除するときにオブジェクトを手動で削除する負担が軽減されます。

于 2013-05-22T11:03:44.303 に答える