8

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

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

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

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

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

4

1 に答える 1

19

std::shared_ptrコンストラクターがどのように機能するかを考えてみましょう。

std::shared_ptr<Foo>(new Foo());

最初にnew Foo()式が評価されます。::operator newオブジェクトにメモリを割り当ててFooから構築します。std::shared_ptr結果のポインターは、コンストラクターに引数として渡されます。

問題が見えますか?Foo割り当てはすでに実行されています。スマート ポインター コンストラクターには、オブジェクトにメモリを割り当てる責任がないため、同じ割り当てで制御ブロックとオブジェクトの両方に空きを割り当てるオプションがありません。

std::make_shared一方、 は両方の割り当てを担当しているため、1 つのヒープ割り当てで両方に余裕を割り当て、その 1 つの割り当て内でオブジェクトと制御ブロックの両方を配置 - 新規 - 構築することができます。

于 2014-10-14T02:54:40.463 に答える