7

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

那么会std::unique_ptr和单例一样执行吗?

4

4 回答 4

12

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

Aunique_ptr确保只有一个智能指针指向任何实例。

于 2013-04-09T15:49:10.170 回答
6

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

不,假设我们有一个旨在成为单例的 Foo 类。使用典型的单例模式,没有办法构造多个 Foo。

有一种std::unique_ptr<Foo>方法将有一个指向 Foo 特定实例的指针,但这不会阻止创建 Foo 的其他实例(使用其他unique_ptrs 或使用指向局部变量的原始指针)。因此 Foo 不会是单身人士。

于 2013-04-09T15:51:18.187 回答
5

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,但这强化了 aunique_ptr并不能保证任何事情,它只是一个指针容器,从它自己的角度来看拥有唯一的所有权,并且通过它的 api,很难意外地创建临时副本。

此外,您可以让其他(智能)指针类型指向相同的原始指针/资源,独立于任何unique_ptr. 完全取决于使用代码来定义其资源和智能指针实例的所有权和生命周期策略

于 2013-04-09T15:51:20.850 回答
0

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

于 2013-04-09T15:50:00.610 回答