問題タブ [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 投票する
3 に答える
5779 参照

c++ - make_shared を使用するとどうなるか

次の 2 行のコードが同じかどうかに興味があります。

これが本当なら、2 行目に割り当てが 1 つしかない理由を誰か説明してもらえますか?

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

c++ - コンパイラが make_shared の使用を自動的に推測するのを止めるものは何ですか?

理解します:

次のものよりも効率的です。

とメリットを理解しています。ただし、コンパイラが次のようなルールを持てなかった理由がわかりません

"宣言 new()と同じ行にある場合は、 "shared_ptrmake_shared

では、コンパイラが自動的に使用するのを止めmake_shared、代わりにそれを指定する必要があるのは何ですか?

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

c++ - std::make_shared(new Foo()) はシングルトンを作成しますか?

が呼び出されると、Foo を構築し、呼び出し元 (つまり、こちら)に対してstd::make_shared(new Foo())を返します。これがさまざまなオブジェクトから複数回呼び出される場合、毎回構築しますか? この場合、各呼び出し元が新しいオブジェクトへの単一の参照を取得し、実際には unque_ptr のように動作するのと同じでしょうか?std::shared_ptr<Foo>new Foo()

それともFoo()、最初に s を作成してから、ある種のシングルトンのように動作することを知って、それに s を返しますかstd::shared_ptr(もちろん、最後std::shared_ptrが破棄されると削除します)? これはプラットフォーム固有のものですか?

具体的には次のような機能です。

0 投票する
3 に答える
901 参照

c++ - c++ std::make_shared と新しいマクロ

の代わりにマクロを使用してnew、デバッグ モードで追加情報を取得します。

これは、カスタム メモリ プロファイリングとメモリ リーク検出に非常に役立つことがわかりました。共有ポインターの使用を開始したばかりなので、次のようなヒープ オブジェクトを作成しています。

std::make_shared使用するメモリ割り当てが少ないため、優先されることを知りました。に私のものを含める方法はありますSAGE_NEWmake_shared? リーク検出には問題ないことはわかっていますが、メモリ使用量の統計には引き続き使用したいと思います。allocate_sharedなんとなく答えが見えてきたような気がしますが、私にはわかりませんでした。ありがとう!:)

編集:について質問する人へnew-私はカスタムでそれをオーバーロードしますnew。コンパイラ オプション SAGE_MEM_INFO は、リーク検出とメモリ使用統計をオンにします。それ以外の場合は、ログをスキップしてメモリ プールの割り当てに直接移動します。new[] と delete[] のバリアントがありますが、簡潔にするために省略しています。

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

c++ - なぜ shared_ptr<> を制御ブロックと管理対象オブジェクトに別々に割り当てる必要があるのですか?

このリンクされた質問は、make_shared<>関数とshared_ptr<>コンストラクターが異なるかどうかを尋ねました。

make_shared を使用するとどうなるか

答えの一部は、make_shared<>通常、ポイントされたオブジェクトとスマート ポインター制御ブロックの両方に 1 回の割り当てでメモリを割り当てることでした。コンストラクターは 2 つのshared_ptr<>割り当てを使用します。

cppreferenceは、コンストラクターがそうする必要があると述べていますが、理由は示されていません。

どうしてこれなの?何らかの理由でそれは不可能ですか?それとも、他の理由で標準で禁止されていますか?

0 投票する
4 に答える
4619 参照

c++ - 共有ポインタの new および make_shared

この投稿と@kerek SB州による回答の1つに出くわしました

コードでは、2 番目の変数はネイキッド ポインターであり、共有ポインターではありません。

今、肉に。make_shared は (実際には) より効率的です。これは、参照制御ブロックを実際のオブジェクトと共に 1 つの動的割り当てで割り当てるためです。対照的に、ネイキッド オブジェクト ポインターを受け取る shared_ptr のコンストラクターは、参照カウント用に別の動的変数を割り当てる必要があります。トレードオフは、割り当てがアロケータによって実行されるため、make_shared (またはその従兄弟の allocate_shared) ではカスタムのデリータを指定できないことです。

(これは、オブジェクト自体の構成には影響しません。オブジェクトの観点からは、2 つのバージョンに違いはありません。より効率的なのは、管理対象オブジェクトではなく、共有ポインター自体です。)

この投稿に関して2つの質問があります。誰かがこれを明確にしてくれれば幸いです

  1. 2 番目のポインタが共有ポインタではないのはなぜですか? それは参照カウントをインクリメントしませんか

  2. make_shared は 1 つのメモリ割り当てのみを作成し、new は 2 つを作成して make_shared をより効率的にするにはどうすればよいですか?

これについて少し説明していただければ幸いです。

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

c++11 - C++11: 'make_shared' は 'std' のメンバーではありません

コードの一部を更新しようとしていて、 を含めようとしましたmake_shared

メールを送信するために Mail というクラスを作成しましたが、それを含めようとしました:

問題は、私が Makefile を使用していることです:

コンパイルには、次のフラグも含まれています。

しかし、次のエラーが発生します。

ここで何が間違っていましたか?