提升,共享ptr和弱ptr?哪个用的?

RLT*_*RLT 43 c++ boost memory-management shared-ptr weak-ptr

在我目前的项目中,我使用boost::shared_ptr得非常广泛.

最近我的队友们也开始使用了weak_ptr.我不知道使用哪一个以及何时使用.

除此之外,如果我想转换weak_ptr为,我该怎么办shared_ptr?是否锁定在其他线程中weak_ptr创建shared_ptr影响我的代码?

Nar*_*tor 70

总的来说,总结一下,

强指针保证了它们的有效性.例如,在以下情况下使用它们:

  • 你拥有被指向的对象; 你创建并销毁它
  • 如果对象不存在,则没有已定义的行为
  • 您需要强制该对象存在.

弱指针保证了解自己的有效性.例如,在以下情况下使用它们:

  • 你访问它,但它不是你的.
  • 如果对象不存在,则已定义行为

弱指针上的Lock()返回一个强指针; 这是你访问弱指针的方法.如果对象不再有效(它已被删除等),则强指针将为NULL,否则,它将指向该对象.你需要检查一下.

它以这种方式设置,以便您在使用它时不会意外删除该对象,因为您已经创建了一个临时(本地)强指针,因此在该强指针保留时会占用该对象的存在.当您使用完该对象时,通常会让强指针超出范围(或重新分配),然后允许删除该对象.对于多线程,请小心对待它们,处理其他没有内置线程安全性的事情,并指出上面提到的保证在多线程时保留.AFAIK他们过去并没有做任何特别的事情.

boost共享指针也具有类似垃圾收集器的功能,因为当指向对象的最后一个强指针消失或指向其他位置时,该对象将被删除.

还有其他答案中提到的性能和循环依赖性.

从根本上说,我会说boost共享指针库允许你不要搞砸一个程序,但它不能代替花时间来正确设计你的指针,对象所有权和生命周期.如果您有这样的设计,可以使用库来强制执行.如果你没有这样的设计,你可能会遇到比以前更多的问题.


blw*_*y10 23

使用weak_ptr在创建对象包含循环引用,即shared_ptr用一个物体shared_ptr回自己.这是因为shared_ptr无法处理循环引用 - 当两个对象超出范围时,相互引用意味着它们不是"垃圾收集",因此内存丢失并且您有内存泄漏.由于weak_ptr不增加引用计数,因此不会发生循环引用问题.这通常也意味着,如果您只想获取指向引用计数的内容并且不想增加其引用计数的指针,那么请使用weak_ptr.

否则,你可以使用shared_ptr.

有关更多信息,请查看Boost 文档.

  • @curiousguy那只是语义.定义循环不存在,即仍然存在一个指针循环,但循环的一个边是weak_ptr引用,正在打破循环!所以你已经承认,当有一个周期时,可以使用weak_ptr,只是在你的术语中,周期不再存在,这就是我所说的不同. (4认同)
  • 谁赢得了这场辩论? (4认同)
  • @curiousguy http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/shared_ptr.htm'使用weak_ptr"打破周期."'所以是的,你可以在有周期时使用弱指针.此外,OP询问了shared_ptr和weak_ptr,因此有理由认为忽略提及scoped_ptr是可以的.否则,我只是说你可以使用shared_ptr,而不是你必须或它是你唯一的选择,我也没有给出不准确的信息(我甚至没有提供任何信息),我甚至链接了文档.对此有什么"错误"或"荒谬"? (2认同)

Ant*_*ima 6

共享指针实现引用计数,弱指针不影响引用计数,如果没有对象的共享指针,只有弱指针,对象会被删除,弱指针现在会告诉您对象已丢失.

使用弱指针有两个原因:

  1. 消除参考计数增加/减少的成本; 但是你不应该这样做,因为它容易出错并且不会真正节省很多时间
  2. 在簿记数据结构中,例如,您拥有所有对象Foo的索引,这些对象是"活着的",即在其他地方使用,并且如果所有"真实"用途都已结束,您不希望在索引中保持Foo活着.这是弱指针的基本实际用例.当然其他也存在.

所以一般来说,我建议只有在你知道要删除引用的对象并想要检测到它时才使用弱指针.在其他情况下使用共享指针(引用计数)或直接指针,尤其是.当您知道对象不会被删除时,在方法局部变量中.同样也是errorprone,但比共享指针更快.

NB循环对象不需要弱指针,你可以在大多数正确构造的程序中使用非熟的常规指针.然而,弱指针风险较小.

  • 我不想虔诚,但我不认为使用智能指针中存储的原始指针是安全的,请参阅我的[回答](http://stackoverflow.com/questions/7011877/shared-ptr - 和 - 逻辑 - 指针 - 所有权 - 使用 - 案例 - 复杂 - 设计/ 7020466#7020466)到另一个问题. (2认同)