boost::shared_ptrの取得について
2023-09-12 08:34:31
質問
私は
boost:shared_ptr
を多用しています。実際、ヒープ上に確保されるオブジェクトのほとんどは
shared_ptr
. 残念ながら、これは私が
this
を受け取る関数に
shared_ptr
. このコードを考えてみましょう。
void bar(boost::shared_ptr<Foo> pFoo)
{
...
}
void Foo::someFunction()
{
bar(this);
}
ここで2つの問題があります。 まず、これはコンパイルできません。
shared_ptr
の T* コンストラクタが明示的であるためです。次に、もし私がそれを
bar(boost::shared_ptr<Foo>(this))
でビルドを強制すると、私のオブジェクトへの2つ目の共有ポインタが作成され、最終的に二重削除につながることになります。
ここで私の疑問が生じました。これらのオブジェクトの 1 つのメソッドの内部から、存在することがわかっている既存の共有ポインターのコピーを取得するための標準的なパターンはありますか? 押し付けがましい参照カウントを使用することが、ここでの私の唯一の選択肢でしょうか?
どのように解決するのですか?
からの導出が可能です。 enable_shared_from_this を継承し、"this" の代わりに "shared_from_this()" を使って、自分自身の self オブジェクトへの共有ポインタを生成できるようになります。
リンク先の例です。
#include <boost/enable_shared_from_this.hpp>
class Y: public boost::enable_shared_from_this<Y>
{
public:
shared_ptr<Y> f()
{
return shared_from_this();
}
}
int main()
{
shared_ptr<Y> p(new Y);
shared_ptr<Y> q = p->f();
assert(p == q);
assert(!(p < q || q < p)); // p and q must share ownership
}
メンバ関数からスレッドを生成する場合、boost::bind to a shared_from_this() の代わりに this を使用するとよいでしょう。 これにより、オブジェクトが解放されないことが保証されます。
関連
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み] UbuntuにBoostをインストールする方法
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む
-
[解決済み] std::shared_ptr of this