11

開発者が呼び出さなくても、オブジェクト自体をコンストラクターに割り当てるスマートポインターを作成することは可能newですか?言い換えれば、書く代わりに:

std::unique_ptr<myClass> my_ptr(new myClass(arg1, arg2))

...次のように書くことができます:

std::smarter_ptr<myClass> my_ptr(arg1, arg2)

言語構文はこれを表現できますか?これは望ましいことでしょうか?恐ろしいです?私は特にこの間違いから保護することを考えています(もちろん、私は自分で作りました):

myFunction(std::unique_ptr<myClass>(new myClass()), std::unique_ptr<myClass>(new myClass()))

...最初のオブジェクトがスマートポインタに安全に格納される前に2番目の割り当てが発生してスローされた場合、最初に割り当てられたオブジェクトがリークするリスクがあります。しかし、よりスマートなポインターは実際にこれを安全にするでしょうか?

4

4 に答える 4

17

の実装を見てくださいmake_shared()。これにより、新しいオブジェクトが割り当てられ、そこから作成shared_ptrされます。

于 2012-07-27T13:44:09.493 に答える
11

一般に、これはスマートポインターのコンストラクターでは実行できません。スマートポインタを初期化するためにポインタ引数を使用するか、新しいオブジェクトを作成するために転送するかについては、あいまいさがあります。

これは、次のようなファクトリ関数を使用して実行できます。

template <typename T, typename... Args>
std::unique_ptr<T> make_unique(Args&&... args) {
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}

を使用している場合はstd::shared_ptr、を使用できますstd::make_shared。これには、1つのメモリ割り当てのみが必要であるという利点もあります。このstd::shared_ptr<T>(new T)場合、オブジェクトに1つ、共有参照カウントに1つが必要になります。

于 2012-07-27T13:57:42.510 に答える
2

これは、完全な転送テンプレートと可変個引数テンプレートを追加したC++11で新たに可能になりました。

于 2012-07-27T13:48:19.943 に答える
2

std::findそれは本質的に必要なものと同じ問題ですstd::find_if。このctorをケース内の既存のctorと区別することはできませshared_ptrnew myClass(arg1)。引数の数は等しく、arg1任意のタイプにすることができます。

したがって、別の名前が必要です。make_shared

于 2012-07-27T13:50:35.020 に答える