unique_ptr如何独一无二?

时间:2014-05-07 12:18:31

标签: c++ c++11

我知道unique_ptr s只能被移动而且没有引用计数。但是我们可以有两个共享资源的智能指针:

Foo* f = new Foo;
auto p1 = std::unique_ptr<Foo>(f);
auto p2 = std::unique_ptr<Foo>(f);

现在这两个类共享一个指向*f的指针。此外,我知道这最终将导致UB,因为我们将进行双重删除,但仍然是:unique_ptr正是&#34;唯一的&#34;如果可能的话?

5 个答案:

答案 0 :(得分:5)

除了我不相信这是想要的或可移植的行为之外,我认为unique_ptr也是声明给在同一个项目上工作的其他人。

来自the reference

  

std :: unique_ptr是一个智能指针,保留唯一的所有权   对象通过指针并在unique_ptr时销毁该对象   超出范围。 没有两个unique_ptr实例可以管理相同的内容   对象

据我所知,您所展示的样本的行为实际上并不需要,也不应该使用。

对于那些不了解主题的人(又名编程为假人):OP所做的就像拥有两个女朋友,彼此不了解。在他们发现之前你很好。当他们这样做时,他们肯定会,你可能希望你不会玩火。

答案 1 :(得分:3)

你的问题类似于,

  

当我用它来驱动钉子时,如何用月牙扳手扳手   到墙上?

换句话说,仅仅因为你错误地使用工具做一些不应该用它做的事情,并不意味着可以&#39; t 做它的目的。

unique_ptr是唯一的,因为如果正确使用指针,您将无法复制指针。它确保只有一个控制对象,并且当容器被销毁时受控对象被正确销毁。

答案 2 :(得分:2)

这是关于所有权语义:

  • 唯一或唯一所有权(例如std::unique_ptr和旧朋友std::auto_ptr):一次只有一个指针拥有一个对象。
  • 共享所有权(例如std::shared_ptrboost::intrusive_ptrlinked_ptr):许多指针共享同一个对象。

答案 3 :(得分:2)

要理解术语,您必须对比unique_ptrshared_ptr

  • 应该唯一负责管理它所指向的资源
  • 后者应该与一组同行分享此责任

通常,您会听到所有权一词来描述清理的责任。

现在,就像C ++中的许多东西一样,你可以尝试颠覆系统:只描述了意图,它取决于你维持你的交易结束。

答案 4 :(得分:1)

它的独特之处在于,如果使用得当,它代表了一种独特的所有权模型 - 只有一个指针可以访问并控制对象的生命周期。将其与代表共享所有权模型的shared_ptr进行比较 - 可以使用多个指针来访问和管理同一个对象。

正如您所指出的那样,您可以通过弄乱哑指针来破坏该模型(保持用于初始化智能指针的那个,或者使用get()或类似的绕过所有权模型)。和往常一样,程序员要注意不要用愚蠢的指针做错事。智能指针无法控制哑指针的使用。