为什么不经常使用弱指针?

时间:2016-03-11 03:37:32

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

问题

很多人问" Why are weak pointers useful?"。对我来说,这是一个毫无疑问的问题,我对它们为何不经常使用而感到困惑。它们是我们最常用于原始指针的语义的最接近的等价物,我倾向于认为它们应该是默认值:管理器将资源分配为共享指针,然后该资源总是通过弱指针引用。

但是,我在网上看到的大多数关于C ++ 11智能指针的文章都关注shared_ptrunique_ptr,但不会花费weak_ptr上的时间。 StackOverflow(example1example2)上有很多博客文章或讨论,只提到弱指针作为"所有权循环的解决方案。问题,虽然恕我直言,这错过了重点(这样的问题可能意味着你的设计首先是有缺陷的)。 Herb Sutter有这个nice article解释了关于如何将智能指针或原始指针/引用作为函数参数传递的最佳实践和相应的语义,但它根本没有提到弱指针!(只有一个comment提及它们。)

弱语义的低使用似乎也可以通过GitHub快速搜索来确认,但当然可以使用类型别名,并且开源代码和专有代码之间的使用可能不同。

enter image description here

弱指针的这种看似低的用法让我感到困惑,因为根据我的个人经验,共享所有权仅在极少数情况下有用,而独特的所有权与非拥有的"参考"这些资源的 1 是最典型的用例,并且尽可能提供更好的设计(RAII等)。

你知道它是否只是感知的低使用率,它们的实际使用和实用性在网络上没有得到很好的体现?如果确实没有太多使用它们,是否有一个好的和客观的原因,我没有看到它?我认为非拥有指针比共享指针更典型的用例是错误的吗?

1 "参考" =原始指针*,引用&或智能指针的通用术语。

暂定答案

在大多数情况下,我感兴趣的指针语义是以下非拥有语义之一:

  1. 非拥有智能指针,可以判断资源是否已过期。可选择允许锁定"如果对象可能在并发线程中到期,则为临时所有权。这是为了支持"观众/观察者"这可能比观察到的对象寿命长。

  2. 非拥有智能指针,支持通过" - >"进行直接解除引用,并在资源过期时中止或抛出异常。这是为了支持资源在设计时保证比函数调用或引用资源的对象更长的用例。我认为这是迄今为止最典型的用例。

  3. 用例1.被std::weak_ptr很好地覆盖。在这种情况下,唯一拥有的资源由shared_ptr管理,&仅用作"唯一所有权,但引用弱指针计数"。作为旁注,我知道Observer模式可能是这个用例的更好的替代方案。

    使用案例2.尽管尽管我认为是最典型的用例,但该标准并未得到很好的支持。在这些情况下,理想情况下应该使用{{1}}引用,但这只有在您不需要存储并重新绑定它时才有效。否则,你要留下来存储一个原始指针,但如果性能不是问题,我宁愿存储一个在对象过期时抛出的智能指针,以捕获编程错误。

    因此,weak_ptr的低使用率可能是因为它只涵盖了案例1,这不是典型的,而它并没有覆盖更典型的案例2。人们通常在案例2中做了什么?

2 个答案:

答案 0 :(得分:0)

因为如果您使用的是shared_ptr,那么您首先需要引用计数方面。 std没有纯引用计数智能指针,因此使用shared_ptr或自定义智能指针。如果我根本不构建循环,则无需使用weak_ptr来中断循环。

意见:非拥有智能指针的用例似乎很无用。我是程序员,我可以完全控制对象的生命周期,如果想要访问此对象,我负责对象/资源可用。这就是C ++。并且用于调试:抱歉,调试器会告诉我是否访问了#34; dead"对象/存储器/资源。

答案 1 :(得分:0)

谁知道为什么。我不相信我应该使用弱指针而不是原始指针。他们有额外的检查,所以你应该付钱,它不是C ++的方式,有时你需要性能。如果您认为弱指针非常有用,请写一些文章,并使用该方法的有用用法。