問題タブ [make-shared]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - std::make_shared がデフォルトのコンストラクターを必要とする理由はありますか?
これがシリアルの要件であるかどうかを把握しようとしています。
クラスコンストラクター(デフォルトのもの)がプライベートであるというエラーが発生し続けますが、これは理由があります。
ただし、エラーの元の行は、シリアルではなく std::make_shared のようです。これにはデフォルトのコンストラクターが必要ですが、既にフレンド クラスであるため、アクセスする必要があります。
なぜこれが起こっているのか、さらに重要なことに、これらのコンストラクターを公開する以外に、どのように解決できるのかを誰かに説明してもらえますか?
編集:
元のエラー行は次のとおりです。
SemanticGraph Ctor の場所:
c++ - make_shared で「className」は値を参照していません
これは機能します:
しかし、make_shared でそれを行う場合:
「ofxDTangibleBase」は値を参照していません」というメッセージが表示されます。修正方法を探しましたが、多くのパラメーターが必要になるなどの問題を抱えている人が見つかりました。
私は何かを見落としていますか?
編集:
コンストラクタは次のようになります。
そして、クラスは別のクラスを拡張します:
c++ - ブースト フェニックス make_shared の作成方法
のブーストフェニックスレイジーバリアントを作成することは可能std::make_sharedですか? つまり、次のようなことを可能にするために
BOOST_PHOENIX_ADAPT_FUNCTIONの可変個引数テンプレートの性質のため、使用できませんstd::make_shared。したがって、ラッパーを作成できる場合は、おそらくラッパー自体が可変個引数テンプレートである必要があります。
c++ - テンプレート コンストラクターを使用した make_shared
テンプレート コンストラクターを持つクラスがあり、それを使用したいと考えてshared_pointerいます。そのような:
の行がmake_shared正しくないことはわかっていますが、解決策がわかりません。make_sharedテンプレートコンストラクターで呼び出すことさえ可能ですか? 「New」関数をテンプレートにして、A<T>何らかの方法で渡す必要がありますか?...
arrays - make_shared で std::array を初期化する
バックグラウンド
ネットワークプロトコル用のドライバーを作成しており、機能があります。write(std::shared_ptr<package> package)ここで、(0=>ヘッダー、1=>本体) です。便宜上、ヘッダーを自動生成し、 の最初の形式を呼び出す関数 を書きたいと思います。そのためには を使用したいのですが、呼び出しから を初期化する際に問題があります。packagestd::array<buffer_ptr,2>write(buffer_ptr body)writestd::make_sharedstd::arraymake_shared
コード
私が試したもの???
(これらはコンパイルエラーにつながりました)
質問:
これを機能させるための解決策はありますか、それとも次のようなものを書く必要がありますか?
package_ptr package=新しいパッケージ{header, body}; 書き込み (パッケージ);
1.b) に頼らなければならないことで、効率が低下し
package_ptr(new package)ますか? (メモリ要求を節約するために、ポインタとインスタンスの共有割り当てメモリを1つのチャンクにしたことを覚えています)Cppreferenceでは次のように読み取ります。
さらに、f(shared_ptr(new int(42)), g()) は、g が例外をスローすると、メモリ リークを引き起こす可能性があります。make_shared を使用すると、この問題は発生しません。
メモリがリークするのはなぜですか (が呼び出される前
int(42)に構築さgれ、g呼び出される前に呼び出される可能性がありますshared_ptr)? そして、1. の代替コードは、そのような潜在的なリークに悩まされるでしょうか?
c++11 - ブレースの初期化と派生クラスから基本クラスへの共有ポインターのキャスト
ブレースの初期化を使用して、派生クラスへの多数の共有ポインターを使用して、基本クラスへの共有ポインターのベクトルを初期化しようとしています。コードは (無関係な詳細を取り除いた後) 次のようになります。
このコードを Visual Studio 2013 でコンパイルしてコンソールで実行すると、結果は次のようになります。
その後、プログラムがクラッシュします。std::shared_ptr<Derived>これは予想されることであり、ブレースの初期化はへの暗黙の変換と互換性がありませんstd::shared_ptr<Base>か、それとも Visual Studio のバグですか? ブレースの初期化は、内部で共有ポインターの変換をブロックする魔法を行いますか (ポインターへの参照の取得など)?
c++ - share_ptr での make_shared の使用T < 56 バイトの場合にのみ有益ですか?
私が理解しているように、それを使用するstd::make_sharedと、基になるオブジェクトと同時に参照カウント オブジェクトが作成されます。
ただし、smart_ptr が指すオブジェクト ポインターが 56 バイトより大きい場合、参照カウンターが別のキャッシュ ラインに配置されることはありません (キャッシュ ラインは 64 バイトであるため)。