2013-05-22 4 views
5

はこのさえ便利ですか?アイデアは、ベクターのpush_backスロー場合にメモリリークを防ぐために、おそらくだっただけauto_ptr、immediate get()、release() - それは便利ですか?私はこの</p> <pre><code>std::auto_ptr<ObjectA> smartptr(new ObjectA(this)); objects_list.push_back(smartptr.get()); smartptr.release(); </code></pre> <p>のような文を多く含んでいる他の誰かのコードに取り組んでいます

objects_list.push_back(new ObjectA(this)); 
+0

'std :: auto_ptr'が便利です。それは使えないだけです。 –

+0

再生成時に 'object_list'がスローされたらどうなりますか?また 'std :: auto_ptr'はC++ 03ですので、C++ 11タグを削除しました。 – Xeo

答えて

13
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のいずれかを格納することができます。

2

を書くのではなく、ここではスマートポインタを使用するには、いくつかの実用的な理由があります。これは、ベクトルを再配置する必要があり、より多くのメモリを割り当てられない場合に発生する可能性があります。

+0

または、オブジェクトのコピー/移動が発生した場合。 – Xeo

+2

Xeo:もしポインタ値のコピーや移動があなたを騙してしまうならば、 –

+0

'object_list'は実際にポインタを格納していると誰が言っていますか?おそらく、 'ObjectA *'から暗黙のうちに構築可能なものを格納していますか? :) – Xeo

1

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

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

関連する問題

 関連する問題