質問

クラス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;引き続きそれを指します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top