使用裸指针而不是weak_ptr 有什么好处吗?

rsj*_*ffe 4 c++ pointers smart-pointers c++11

问题:是否有任何令人信服的理由将裸指针用于非拥有资源,或者我们应该使用weak_ptr

CPP.参考状态

std::weak_ptr 模型临时所有权:当对象只有存在时才需要访问,并且可以随时被其他人删除

但是,在接受的答案中,我何时使用哪种指针?我们有以下声明:

对资源的非拥有引用使用哑指针(原始指针)或引用,并且当您知道资源将超过引用对象/范围时。当您需要可空性或可重置性时,更喜欢引用并使用原始指针.... ashared_ptr并使用 a weak_ptr

这个答案后面有很多关于使用裸指针的反复讨论,没有真正的解决方案。我看不出使用哑指针的任何理由。我错过了什么吗?

Che*_*Alf 6

Aweak_ptr有一个非常具体的目的:打破shared_ptr循环。例如,std::enable_shared_from_this基于让一个对象包含一个weak_ptrto 自身。如果它直接包含 ashared_ptr那么会创建一个循环,所以它有一个weak_ptr.

您使用 a weak_ptr,否则您将使用shared_ptr. 的weak_ptr具有更高的成本,因为除了的成本shared_ptr有该物体存在的检查产生一个shared_ptr,或没有。它也是一种更复杂的野兽,因此更容易被错误地使用。

我想不出任何weak_ptr与“临时所有权”有关的方法(除了在检查存在并使用生产后shared_ptr,这是一个临时共享所有权,每次使用都会重复一次)。例如,std::enable_shared_from_this与临时所有权无关。通常我会忽略这种声明的来源,并建议其他人忽略它,但 cppreference.com 是我们拥有的最好的免费在线 C++ 参考。奇怪的是它包含了一个废话。但是,没有什么是级长,正如我曾经在 clc++ 中对 Bjarne 所说的那样,于是他纠正了我对“级长”的拼写。嗯!好。


我不知道使用原始指针而不是 a 有什么好处weak_ptr,其中 aweak_ptr是必需的。原始指针不能完成 aweak_ptr的工作来保持 ashared_ptr的控制块,所以在我看来,仅仅用原始指针替换 a 的想法weak_ptr是无稽之谈。但是,当人们停止对自己从未想过的事情感到惊讶的那一天,就是死去的那一天,所以可能会有一些我不知道的这种用法。


此外,使用 a weak_ptrwhere 原始指针是必需的也没有优势。相反,这weak_ptr引入了控制块分配和引用计数的相对较大的成本。所以我想不出任何用 替换原始指针有意义的情况weak_ptr,而且我不希望这是我学习其他情况的情况。