C++ 单例模式和std::unique_ptr

C++ 单例模式和std::unique_ptr,c++,singleton,unique-ptr,C++,Singleton,Unique Ptr,std::unique_ptr唯一地控制它指向的对象,因此不使用引用计数。单例确保只能使用引用计数创建一个对象 那么std::unique_ptr的性能是否会与单例相同 单个实例确保一个类型只有一个实例 unique\u ptr确保只有一个智能指针指向任何实例。如果我错了,请纠正我,但据我所知,Singleton是一个只能有一个实例的类。那完全不同。所以没有 那么std::unique_ptr的性能是否与单例相同 不,假设我们有一个打算成为单身汉的Foo班。使用典型的单例模式,无法构造多个Foo

std::unique_ptr
唯一地控制它指向的对象,因此不使用引用计数。单例确保只能使用引用计数创建一个对象


那么
std::unique_ptr
的性能是否会与单例相同

单个实例确保一个类型只有一个实例


unique\u ptr
确保只有一个智能指针指向任何实例。

如果我错了,请纠正我,但据我所知,Singleton是一个只能有一个实例的类。那完全不同。所以没有

那么std::unique_ptr的性能是否与单例相同

不,假设我们有一个打算成为单身汉的Foo班。使用典型的单例模式,无法构造多个Foo


拥有一个
std::unique_ptr
意味着将有一个指向特定Foo实例的指针,但这并不阻止创建其他Foo实例(使用其他
unique_ptr
s或使用指向局部变量的原始指针)。因此,Foo就不会是一个单一的对象。

std::unique\u ptr
通过只提供移动构造函数而不提供复制构造函数或赋值操作符来实现单一所有权语义

这根本不是单例的情况,因为可以有多个
unique\ptr
引用相同类型的不同实例。singleton不允许您直接构造类型,而是提供一个管理唯一实例的访问器

此外,Drew的断言是

“唯一的_ptr确保只有一个智能指针指向任何实例。”

这是错误的。如果您只是这样做:

T* nt = new T;
std::unique_ptr<T> up1(nt);
std::unique_ptr<T> up2(nt);
T*nt=新的T;
std::唯一的ptr up1(nt);
标准::唯一的ptr up2(nt);
然后,您有两个拥有相同资源的唯一指针——您只会在运行时注意到问题,而不会在编译时注意到问题。当然,这是对
unique_ptr
的不正确使用,但这强化了
unique_ptr
并不能保证任何东西,它只是一个指针容器,从自身角度拥有唯一所有权,通过其api,很难意外创建临时副本


此外,您可以让其他(智能)指针类型指向相同的原始指针/资源,而不依赖于任何
唯一的\u ptr
。这完全取决于使用代码来定义其资源和智能指针实例的所有权和生存期策略

我不明白您是如何得出这一结论的!嗯,
std::unique_ptr
..@sftrabbit可以有任意数量的实例。我以某种扭曲的方式混淆了
单例
的原则与
std::unique_ptr
的原则。感谢大家提供的澄清。很好的说明,但我认为你的意思是
独特的\u ptr
,而不是
共享的\u ptr
?你的第二句话不一定是真的。@PreetKukreti我同意你的回答。我可能是自己最大的敌人,并断言我的第一句话也不一定是真的。您可以利用错误代码来复制这两种代码。考虑我用“保证”来表示“采取措施帮助确保”。也许我应该编辑一下……不用担心,反正我把你投了赞成票,你描述得很简洁:)