6

クラス 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 に置き換えられたときに解放されますか? そうなると確信していますが、質問/共有する価値があると思いました.

4

3 に答える 3

7

まず、質問のタイトルにはboost::auto_ptrと書かれていますが、実際にはboost::shared_ptrを意味しています

はい、元のポインターは解放されます (それへの共有参照がそれ以上ない場合)。

于 2008-09-26T15:00:20.190 に答える
1

... セクションで何が起こるかによって異なります

コンテナ クラスには foo_sp のインスタンスのコピーm[0] = p2;が含まれています。そのコピーを実行すると、p元々その場所にあったコピーがスコープ外になります。その際、他の foo_sp が参照していなければ削除されます。

2 行目で宣言されたコピーfoo_sp p(new foo);がまだ残っている場合、メモリの割り当ては解除されません。エントリへのすべての参照が削除されると、エントリは削除されます。

于 2008-09-26T15:09:36.657 に答える
0

stackoverflow ではコメントできないので、お答えします。:/

"p" がスコープ外に出る様子は見られないため、p が指すオブジェクトは解放されません「p」は引き続きそれを指します。

于 2008-09-26T15:05:34.140 に答える