std::unique_ptr
唯一地控制它指向的对象,因此不使用引用计数。单例确保只能使用引用计数创建一个对象。
那么std::unique_ptr
会对单身人士表现相同吗?
答案 0 :(得分:11)
单身人士确保只有一个类型
。 unique_ptr
确保只有一个智能指针到任何实例。
答案 1 :(得分:5)
然后std :: unique_ptr会与单身人士完全相同吗?
没有。假设我们有Foo类,它打算成为一个单身人士。使用典型的单例模式,无法构造多个Foo。
拥有std::unique_ptr<Foo>
意味着将有一个指向Foo特定实例的指针,但这并不会阻止创建其他Foo实例(使用其他unique_ptr
s或使用原始指针到局部变量)。因此,Foo,不会是单身人士。
答案 2 :(得分:3)
std::unique_ptr
通过仅提供移动构造函数而不提供复制构造函数或赋值运算符来实现单个所有权语义。
根本不是单例的情况,因为您可以有多个unique_ptrs
引用相同类型的不同实例。单例不允许您直接构造类型,但提供了一个管理唯一实例的访问器。
此外,德鲁的断言
“unique_ptr只确保一个指向任何实例的智能指针。”
是假的。如果您只是这样做:
T* nt = new T;
std::unique_ptr<T> up1(nt);
std::unique_ptr<T> up2(nt);
然后你有两个拥有相同资源的独特指针 - 你只会在运行时发现问题,而不是编译时。当然,这是unique_ptr
的错误用法,但这加强了unique_ptr
不能确保你做任何事情,它只是一个指针容器,它从自己的角度拥有唯一的所有权,并通过它的api,很难不小心创建临时副本。
此外,您可以让其他(智能)指针类型独立于任何unique_ptr
指向相同的原始指针/资源。完全取决于使用代码来定义其资源和智能指针实例的所有权和生命周期策略
答案 3 :(得分:0)
如果我错了,请纠正我,但据我记得,单身人士是一个只能有一个实例的班级。那是完全不同的。所以没有。