【发布时间】:2015-04-02 14:48:07
【问题描述】:
我声明了一个类似的类型
template <typename T>
using SmartPtr = std::unique_ptr<T, MyDeleter>;
在某些特定情况下,我想计算对对象的引用并在指针超出范围时有条件地删除它。
我知道有 std::shared_ptr 类,但我有一些我想通过公共接口访问的对象。其中一些对象归其类所有,其他类有一个工厂方法,可以产生它们创建的对象的所有权。
我的问题是:
-
SmartPtr类型的每个指针是否都有自己的个人MyDeleter对象? - 是否有多个
std::unique_ptrs 指向同一个对象被认为是一种不好的编码习惯?即使我使用自定义删除器?
在没有删除器的情况下使用 shared_ptr 对我来说感觉不对,因为类拥有的对象无论如何都不能被删除,因为它们不是通过 new 创建的。它们是数组的一部分,是类的成员。并非所有 SmartPtr 指向的对象都是使用 new 运算符创建的。
【问题讨论】:
-
“有多个 std::unique_ptrs 指向同一个对象” “unique”这个词是一个赠品,不是吗?你能进一步解释为什么
std::shared_ptr不适合你吗? -
这对我来说似乎很可笑。你认为你为什么需要这个?
-
为什么不用升压精神?那么问题来了,你将拥有的所有空闲时间都找到一个用途。放弃这个有趣的指针想法,继续前进。
-
@LightningRacisinObrit 使用带有自定义删除器的 unique_ptr 滚动侵入式智能计数指针并不是无法使用的设计。它确实不必要地阻塞了复制构造,并且它给出了一个具有误导性的类型名称。我自己,我会写我自己的侵入式智能计数指针,但它会拥有一个 unique_ptr 而不是它内部的原始指针。那个 unique_ptr 会减少使用计数,所以基本上就是 OP 想要做的事情:我只是将它隐藏在一个层中,所以我得到了复制操作和一个更好的名字。
-
@biowep:
shared_ptr为您提供移动语义。引用计数从 1 到 2 再回到 1,而无需复制目标。
标签: c++ smart-pointers unique-ptr