0

私はいくつかの共有ポインタを持っていますshared_ptr<T> pointer1(new T(1));

ここで、コードの他の部分に明示的なコピーがあります(または他のコンテナーpointer2に格納されると思います)。std::mapのようにコピーが行われたとしましょうmap.insert(make_pair(key1, pointer1));

私はその 2 番目のコピーを一部のデータをプリキャッシュするためだけに使用しています。これは、メイン ポインターが既に無効である場合、2 番目のポインターを格納する必要がないことを意味します。この場合、どうすればよいですか?

pointer1コードの他の部分で無効になったことがわかっている場合、2 番目のポインターのメモリ割り当てを強制的に解除する方法はありますか?

または、醜い方法を取る必要があります-時々、マップにptr.unique()設定されているポインターをチェックして、trueそれらを破壊しますか?

多分いくつかの代替案/アドバイスはありますか?


編集 - プレーンコードサンプル

std::map<int, shared_ptr<int> > map;

{
   shared_ptr<int> pointer1(new int(5));
   map.insert(std::make_pair(0, pointer1));
}

<0, shared_ptr[NULL]>これらの操作が発生した後ではなく、マップを含むようにする方法/トリックはあります<0, shared_ptr[5]>か?

ありがとう

4

2 に答える 2

1

これはweak_ptrのタスクのようです:

http://www.boost.org/doc/libs/1_40_0/libs/smart_ptr/weak_ptr.htm

shared_ptr の代わりにそれらをテーブルに入れてみてください。

于 2010-07-12T21:55:55.577 に答える
1

私はその 2 番目のコピーを一部のデータをプリキャッシュするためだけに使用しています。これは、メイン ポインターが既に無効である場合、2 番目のポインターを格納する必要がないことを意味します。この場合、どうすればよいですか?

boost::weak_ptr を確認する必要があります。関連する shared_ptr がリセットされた場合、weak_ptr はそれを認識します。

コードの他の部分で pointer1 が無効になったことがわかっている場合、2 番目のポインターのメモリ割り当てを強制的に解除する方法はありますか?

そうは思わないでください。
ただし、弱いポインターを使用する場合、これは必要ありません。

于 2010-07-12T21:58:53.773 に答える