boost :: shared_ptr標準コンテナ
-
02-07-2019 - |
質問
クラスfooがあり、std :: mapを使用してboost :: shared_ptrsを保存したいとします。例:
class foo;
typedef boost::shared_ptr<foo> foo_sp;
typeded std::map<int, foo_sp> foo_sp_map;
foo_sp_map m;
新しいfoo_spをマップに追加したが、使用されたキーが既に存在する場合、既存のエントリは削除されますか?例:
foo_sp_map m;
void func1()
{
foo_sp p(new foo);
m[0] = p;
}
void func2()
{
foo_sp p2(new foo);
m[0] = p2;
}
元のポインター(p)は、p2に置き換えられたときに解放されますか?そうなると確信していますが、質問/共有する価値があると思いました。
解決
まず、質問のタイトルにはboost :: auto_ptrと書かれていますが、実際にはboost :: shared_ptrを意味しています
そして、はい、元のポインターは解放されます(それに対する共有参照がそれ以上ない場合)。
他のヒント
...セクションで何が起こるかによって異なります
m [0] = p2;
を実行したときに、コンテナクラスにはfoo_spのインスタンスのコピーが含まれます。元々その場所にあったものは範囲外です。その時点で、他のfoo_spがそれを参照していない場合は削除されます。
2行目 foo_sp p(new foo);
で宣言されたコピーがまだ残っている場合、メモリの割り当ては解除されません。エントリは、すべての参照が削除されると削除されます。
stackoverflowではコメントが許可されないため、回答します。 :/
&quot; p&quot;が表示されないスコープ外に出るため、それが指すオブジェクトは解放されません 。 &quot; p&quot;引き続きそれを指します。
所属していません StackOverflow