1

f次のような関数があるとします。

class MyClass {
};

boost::shared_ptr<MyClass> f(/*other input parameters*/) {
  static boost::shared_ptr<MyClass> p;
  if (!p.get() || /*Test if somebody else has a copy of my pointer*/) {
    p.reset(new MyClass() );
  }

  /*Do other stuff*/

  return p;
}

呼び出し元がポインターのコピーを保持しているかどうかを確認できますか? 私がポインタを放し、彼もポインタを放した場合、メモリは解放されますか?

4

3 に答える 3

1

呼び出し元がポインターのコピーを保持しているかどうかを確認できますか?

いいえ、ヴラドが言ったように、あなたは本当に知りたくないはずです. このuse_count機能はありますが、ブーストは使用しないように警告します。

注: use_count() は必ずしも効率的ではありません。本番コードではなく、デバッグとテストの目的でのみ使用してください。

2 番目の質問については、

私がポインタを放し、彼もポインタを放した場合、メモリは解放されますか?

所有権がこれら 2 つのインスタンス間でのみ共有されていれば、答えはイエスです。

于 2013-10-18T15:56:20.377 に答える
0

グローバル演算子newdelete演算子をオーバーライドして、ポインタが指すメモリがまだ占有されているかどうかを確認できます。その場合、メモリを指す独自の共有ポインターをリセットした場合、唯一の結論は、ユーザーが自分のポインターをリセットしていないということです。ただし、これは必ずしも効率的または推奨されるわけではありません。に含まれるポインタも、カスタム デリータ機能により、によってshared_ptr割り当てられたメモリを必ずしも指すとは限りません。new

于 2013-10-19T19:36:08.483 に答える
0

boost::shared_ptr(and std::tr1::shared_ptr, and in C++11 )の要点はstd::shared_ptr、共有ポインタのコピーを保持しているコードの最後のビットが存在しなくなると、メモリが解放されることです。

[編集: 完全に不正確な分析を削除]

于 2013-10-19T00:44:09.027 に答える