问题:是否有任何令人信服的理由将裸指针用于非拥有资源,还是我们应该使用weak_ptr
?
std::weak_ptr
模拟临时所有权:当一个对象只有存在时才需要被访问,并且其他人可以随时删除该对象
但是,在Which kind of pointer do I use when?的接受答案中,我们有声明:
使用dumb指针(原始指针)或对资源的非拥有引用的引用,并且当您知道资源将比引用对象/范围更长时。当你需要可空性或可重置性时,更喜欢引用和使用原始指针....如果你想要一个非拥有的资源引用,但你不知道资源是否会比引用它的对象更长,请打包
shared_ptr
中的资源并使用weak_ptr
。
这个答案之后是关于裸指针使用的大量反复,没有真正的解决方案。我看不出使用哑指针的任何理由。我错过了什么吗?
答案 0 :(得分:4)
weak_ptr
有一个非常特殊的目的:打破shared_ptr
个周期。例如,std::enable_shared_from_this
基于让对象包含weak_ptr
本身。如果它直接包含shared_ptr
那么会创建一个循环,所以它有一个weak_ptr
。
您使用weak_ptr
,否则您将拥有shared_ptr
。 weak_ptr
的成本更高,因为除shared_ptr
的费用外,还有对象存在检查生成 shared_ptr
, 或不。此外,它是一个更复杂的野兽,因此更容易错误使用。
我无法想到weak_ptr
与“临时所有权”有任何关系(除了在检查存在并使用生成的shared_ptr
之后,这是一个临时共享所有权,每次使用都会反复重复)。例如,std::enable_shared_from_this
与临时所有权无关。通常我会忽略这种声明的来源,并建议其他人忽略它,但cppreference.com是我们在免费在线C ++参考方面的最佳方式。奇怪的是它包含一个无意义的陈述。但是,没有什么是完美的,因为我曾经用clc ++对Bjarne说过话,于是他纠正了我的“长官”。哼!好。
我不知道使用原始指针而不是weak_ptr
有什么好处,其中weak_ptr
是必需的。原始指针不能执行weak_ptr
控制shared_ptr
控制块的工作,因此在我看来,仅仅想法替换了带有原始指针的weak_ptr
是无意义的。但是,那天,人们从未想到过的事情就会让人感到惊讶,那就是第一天已经死了,所以可能会出现一些模糊不清的情况。
此外,使用weak_ptr
没有优势,其中原始指针是必需的。相反,weak_ptr
引入了控制块分配和引用计数相对较大的成本。所以我想不出用weak_ptr
替换原始指针有意义的任何情况,我不认为这是我学习的情况。
答案 1 :(得分:2)
弱指针实际上几乎没有用处。弱指针只有在需要它的锁定功能时才会有用(将指针转换为共享指针,以防止在操作时进行垃圾收集)。非拥有指针最好,如果你只是使用原始指针,因为开销共享和弱指针都有。