問題タブ [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.

0 投票する
1 に答える
2240 参照

c++ - std::make_shared がデフォルトのコンストラクターを必要とする理由はありますか?

これがシリアルの要件であるかどうかを把握しようとしています。

クラスコンストラクター(デフォルトのもの)がプライベートであるというエラーが発生し続けますが、これは理由があります。

ただし、エラーの元の行は、シリアルではなく std::make_shared のようです。これにはデフォルトのコンストラクターが必要ですが、既にフレンド クラスであるため、アクセスする必要があります。

なぜこれが起こっているのか、さらに重要なことに、これらのコンストラクターを公開する以外に、どのように解決できるのかを誰かに説明してもらえますか?

編集:

元のエラー行は次のとおりです。

SemanticGraph Ctor の場所:

0 投票する
1 に答える
1245 参照

c++ - make_shared で「className」は値を参照していません

これは機能します:

しかし、make_shared でそれを行う場合:

「ofxDTangibleBase」は値を参照していません」というメッセージが表示されます。修正方法を探しましたが、多くのパラメーターが必要になるなどの問題を抱えている人が見つかりました。

私は何かを見落としていますか?

編集:

コンストラクタは次のようになります。

そして、クラスは別のクラスを拡張します:

0 投票する
2 に答える
469 参照

c++ - ブースト フェニックス make_shared の作成方法

のブーストフェニックスレイジーバリアントを作成することは可能std::make_sharedですか? つまり、次のようなことを可能にするために

BOOST_PHOENIX_ADAPT_FUNCTIONの可変個引数テンプレートの性質のため、使用できませんstd::make_shared。したがって、ラッパーを作成できる場合は、おそらくラッパー自体が可変個引数テンプレートである必要があります。

0 投票する
1 に答える
2130 参照

c++ - テンプレート コンストラクターを使用した make_shared

テンプレート コンストラクターを持つクラスがあり、それを使用したいと考えてshared_pointerいます。そのような:

の行がmake_shared正しくないことはわかっていますが、解決策がわかりません。make_sharedテンプレートコンストラクターで呼び出すことさえ可能ですか? 「New」関数をテンプレートにして、A<T>何らかの方法で渡す必要がありますか?...

0 投票する
1 に答える
1639 参照

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

コード

私が試したもの???

(これらはコンパイルエラーにつながりました)

質問:

  1. これを機能させるための解決策はありますか、それとも次のようなものを書く必要がありますか?

    package_ptr package=新しいパッケージ{header, body}; 書き込み (パッケージ);

    1.b) に頼らなければならないことで、効率が低下しpackage_ptr(new package)ますか? (メモリ要求を節約するために、ポインタとインスタンスの共有割り当てメモリを1つのチャンクにしたことを覚えています)

  2. Cppreferenceでは次のように読み取ります。

    さらに、f(shared_ptr(new int(42)), g()) は、g が例外をスローすると、メモリ リークを引き起こす可能性があります。make_shared を使用すると、この問題は発生しません。

    メモリがリークするのはなぜですか (が呼び出される前int(42)に構築さgれ、g呼び出される前に呼び出される可能性がありますshared_ptr)? そして、1. の代替コードは、そのような潜在的なリークに悩まされるでしょうか?

0 投票する
0 に答える
36 参照

c++11 - ブレースの初期化と派生クラスから基本クラスへの共有ポインターのキャスト

ブレースの初期化を使用して、派生クラスへの多数の共有ポインターを使用して、基本クラスへの共有ポインターのベクトルを初期化しようとしています。コードは (無関係な詳細を取り除いた後) 次のようになります。

このコードを Visual Studio 2013 でコンパイルしてコンソールで実行すると、結果は次のようになります。

その後、プログラムがクラッシュします。std::shared_ptr<Derived>これは予想されることであり、ブレースの初期化はへの暗黙の変換と互換性がありませんstd::shared_ptr<Base>か、それとも Visual Studio のバグですか? ブレースの初期化は、内部で共有ポインターの変換をブロックする魔法を行いますか (ポインターへの参照の取得など)?

0 投票する
1 に答える
160 参照

c++ - share_ptr での make_shared の使用T < 56 バイトの場合にのみ有益ですか?

私が理解しているように、それを使用するstd::make_sharedと、基になるオブジェクトと同時に参照カウント オブジェクトが作成されます。

ただし、smart_ptr が指すオブジェクト ポインターが 56 バイトより大きい場合、参照カウンターが別のキャッシュ ラインに配置されることはありません (キャッシュ ラインは 64 バイトであるため)。