我知道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;如果可能的话?
答案 0 :(得分:5)
除了我不相信这是想要的或可移植的行为之外,我认为unique_ptr
也是声明给在同一个项目上工作的其他人。
std :: unique_ptr是一个智能指针,保留唯一的所有权 对象通过指针并在unique_ptr时销毁该对象 超出范围。 没有两个unique_ptr实例可以管理相同的内容 对象强>
据我所知,您所展示的样本的行为实际上并不需要,也不应该使用。
对于那些不了解主题的人(又名编程为假人):OP所做的就像拥有两个女朋友,彼此不了解。在他们发现之前你很好。当他们这样做时,他们肯定会,你可能希望你不会玩火。
答案 1 :(得分:3)
你的问题类似于,
当我用它来驱动钉子时,如何用月牙扳手扳手 到墙上?
换句话说,仅仅因为你错误地使用工具做一些不应该用它做的事情,并不意味着可以&#39; t 做它的目的。
unique_ptr
是唯一的,因为如果正确使用指针,您将无法复制指针。它确保只有一个控制对象,并且当容器被销毁时受控对象被正确销毁。
答案 2 :(得分:2)
这是关于所有权语义:
std::unique_ptr
和旧朋友std::auto_ptr
):一次只有一个指针拥有一个对象。std::shared_ptr
,boost::intrusive_ptr
,linked_ptr
):许多指针共享同一个对象。答案 3 :(得分:2)
要理解术语,您必须对比unique_ptr
和shared_ptr
:
通常,您会听到所有权一词来描述清理的责任。
现在,就像C ++中的许多东西一样,你可以尝试颠覆系统:只描述了意图,它取决于你维持你的交易结束。
答案 4 :(得分:1)
它的独特之处在于,如果使用得当,它代表了一种独特的所有权模型 - 只有一个指针可以访问并控制对象的生命周期。将其与代表共享所有权模型的shared_ptr
进行比较 - 可以使用多个指针来访问和管理同一个对象。
正如您所指出的那样,您可以通过弄乱哑指针来破坏该模型(保持用于初始化智能指针的那个,或者使用get()
或类似的绕过所有权模型)。和往常一样,程序员要注意不要用愚蠢的指针做错事。智能指针无法控制哑指针的使用。