[解決済み] shared_ptrを参照渡しした方が良いですか?重複
質問
shared_ptrを渡すためのベストプラクティスは何ですか?
現在、私はshared_ptr関数の引数をこのように渡しています。
void function1( shared_ptr<TYPE>& value );
どのように解決するのですか?
制御された環境では、共有ポインタを 定数参照 . ただし、オブジェクトを同時に削除する人がいないことを確認する必要があります。
一般的には、共有ポインタをそのまま コピー . これにより、意図されたセマンティクスが得られます。共有ポインタのコピーを含むすべてのスコープは、所有権におけるその "share" によって、オブジェクトを保持し続けます。
常に値で渡さない唯一の理由は、共有ポインタのコピーがアトミックな参照カウントの更新のために一定の代償を伴うということです。
オプションの余談です。
主な質問には答えられたので、おそらくあなたがすべきいくつかの方法を検討することは有益です。
決して
共有ポインタを使用する必要があります。ここでちょっとした思考実験をしてみましょう。共有ポインタの型を定義してみましょう
SF = std::shared_ptr<Foo>
. 関数の引数を渡すのではなく、参照を考慮するために、この型を見てみましょう。
RSF = std::reference_wrapper<T>
. つまり,共有ポインタ
SF p(std::make_shared<Foo>());
を使えば、値のセマンティクスを持つ参照ラッパーを作ることができます。
RSF w = std::ref(p);
. 設定はこれくらいにしておきましょう。
さて、ポインターのコンテナは地雷原であることは誰もが知っています。そこで
std::vector<Foo*>
は維持するのが悪夢のようなもので、不適切な寿命管理からいくつものバグが発生します。概念的にもっと悪いのは、誰が
を所有する
が明確でないことです。ポインタは、動的オブジェクト、自動オブジェクト、およびゴミへのポインタが混在している可能性さえあります。誰もそれを知ることはできません。そこで、標準的な解決策としては
std::vector<SF>
を代わりに使うことです。これが「共有ポインタの正しい使い方」です。一方、絶対に使ってはいけないのは
std::vector<RSF>
-- これは管理不可能な怪物で、実は元の裸のポインタのベクトルと非常によく似ているのです! 例えば、参照を保持しているオブジェクトがまだ生きているかどうかが不明な場合です。共有ポインターの参照を取ることは、その目的全体を破ってしまったのです。
2つ目の例として、共有ポインタがあるとします
SF p
があるとします。ここで、関数
int foo(SF)
を同時に実行させたいとします。通常の
std::thread(foo, p)
はうまく機能します。スレッドコンストラクタが
コピー
を作成するからです。しかし、もし私たちが
std::thread(foo, std::ref(p))
と言っていたら、大変なことになっていたでしょう。呼び出し側のスコープにある共有ポインタが期限切れになってオブジェクトが破壊され、ぶら下がった参照と無効なポインタが残ることになります!
これらの 2 つのかなり不自然な例から、共有ポインターを本当に コピー . うまく設計されたプログラムでは、誰がどのリソースに責任を持つかは常に明確であるべきで、正しく使用された場合、共有ポインターはそのための素晴らしいツールです。
関連
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】shared_ptrは参照で渡すべきか、値で渡すべきか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++のGetlineの問題(オーバーロードされた関数 "getline "のインスタンスがない
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】shared_ptrは参照で渡すべきか、値で渡すべきか?