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

时间:2016-03-22 23:16:53

标签: c++ pointers c++11 smart-pointers

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

CPP.reference

  

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

但是,在Which kind of pointer do I use when?的接受答案中,我们有声明:

  

使用dumb指针(原始指针)或对资源的非拥有引用的引用,并且当您知道资源将比引用对象/范围更长时。当你需要可空性或可重置性时,更喜欢引用和使用原始指针....如果你想要一个非拥有的资源引用,但你不知道资源是否会比引用它的对象更长,请打包shared_ptr中的资源并使用weak_ptr

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

2 个答案:

答案 0 :(得分:4)

weak_ptr有一个非常特殊的目的:打破shared_ptr个周期。例如,std::enable_shared_from_this基于让对象包含weak_ptr本身。如果它直接包含shared_ptr那么会创建一个循环,所以它有一个weak_ptr

您使用weak_ptr,否则您将拥有shared_ptrweak_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)

弱指针实际上几乎没有用处。弱指针只有在需要它的锁定功能时才会有用(将指针转换为共享指针,以防止在操作时进行垃圾收集)。非拥有指针最好,如果你只是使用原始指针,因为开销共享和弱指针都有。