7

std::unique_ptr指し示すオブジェクトを一意に制御するため、参照カウントを使用しません。シングルトンは、参照カウントを使用して作成できるオブジェクトが 1 つだけであることを保証します。

その後std::unique_ptr、シングルトンと同じように機能しますか?

4

4 に答える 4

12

シングルトンは、型のインスタンスを 1 つだけ保証します。

Aは、任意のインスタンスへのスマート ポインターを 1 つだけunique_ptr保証します。

于 2013-04-09T15:49:10.170 に答える
6

次に、std::unique_ptr はシングルトンと同じように機能しますか?

いいえ、シングルトンを意図したクラス Foo があるとしましょう。典型的なシングルトン パターンを使用すると、複数の Foo を構築する方法はありません。

手段を持つことstd::unique_ptr<Foo>で、Foo の特定のインスタンスへの 1 つのポインターが存在しますが、それによって Foo の他のインスタンスの作成が妨げられることはありません (他unique_ptrの s またはローカル変数への生のポインターを使用)。したがって、Foo はシングルトンではありません。

于 2013-04-09T15:51:18.187 に答える
5

std::unique_ptr移動コンストラクターのみを提供し、コピー コンストラクターまたは代入演算子を提供しないことで、単一所有権のセマンティクスを実現します。

unique_ptrs同じタイプの異なるインスタンスを参照する複数のインスタンスを持つことができるため、これはシングルトンのケースではありません。シングルトンでは型を直接構築することはできませんが、単一のインスタンスを管理するアクセサーを提供します。

また、ドリューの主張は

"unique_ptr は、任意のインスタンスへの 1 つのスマート ポインターのみを保証します。"

は偽です。単に行う場合:

T* nt = new T;
std::unique_ptr<T> up1(nt);
std::unique_ptr<T> up2(nt);

次に、同じリソースを所有する2つの一意のポインターがあり、コンパイル時ではなく実行時にのみ問題に気付くでしょう。もちろん、これは の誤った使用法ですが、これは、 aが何も保証しないことをunique_ptr補強します。これは、独自の観点から唯一の所有権を保持する単なるポインター コンテナーであり、その API を介して、誤って一時コピーを作成することを困難にします。unique_ptr

さらに、他の (スマート) ポインター型が、任意のunique_ptr. リソースとスマート ポインター インスタンスの所有権と有効期間のポリシーを定義するのは、使用するコード次第です。

于 2013-04-09T15:51:20.850 に答える
0

私が間違っている場合は訂正してください。ただし、私が覚えている限り、シングルトンはインスタンスを 1 つしか持てないクラスです。それはまったく違います。いいえ。

于 2013-04-09T15:50:00.610 に答える