提升,共享ptr vs弱ptr? 哪个使用时?

在我目前的项目中,我广泛使用了boost::shared_ptr

最近我的队友也开始使用weak_ptr 。 我不知道使用哪一个,什么时候使用。

除此之外,如果我想将weak_ptr转换为shared_ptr ,我该怎么做。 在weak_ptr上创build一个shared_ptr的锁会影响我的代码在其他线程?

总而言之,

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

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

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

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

locking()弱指针返回一个强大的指针; 这是你如何访问弱指针。 如果对象不再有效(已被删除等),则强指针将为NULL,否则将指向该对象。 你需要检查这个。

它是这样设置的,所以当你使用它的时候,你不会意外地删除这个对象,因为你已经创build了一个临时(本地)的强指针,从而在强指针保留的时候保留了对象的存在。 当你完成对象的使用时,你通常会让强指针超出范围(或重新指定它),然后允许删除对象。 对于multithreading来说,对待它们的方式和对待没有内置线程安全性的其他东西一样要注意,上面提到的保证在multithreading的时候保持不变。 AFAIK他们没有做任何特别的事情。

boost共享指针也具有垃圾收集器的特性,因为当最后一个指向某个对象的强指针消失或指向其他地方时,该对象被删除。

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

从根本上讲,我认为boost共享指针库可以让你不把一个程序放在一起,但它不能替代花时间正确devise指针,对象所有权和生命周期。 如果你有这样的devise,你可以使用库来执行它。 如果你没有这样的devise,你可能会碰到不同的问题。

当您创build的对象包含循环引用时,使用weak_ptr ,即将shared_ptr返回给您自己的shared_ptr对象。 这是因为shared_ptr无法处理循环引用 – 当两个对象超出范围时,相互引用意味着它们不是“垃圾回收”,所以内存丢失,并且内存泄漏。 由于weak_ptr不会增加引用计数,所以不会发生循环引用问题。 这也意味着一般情况下,如果你只是想要一个指向引用计数的东西,而不想增加引用计数,那就使用weak_ptr

否则,你可以使用shared_ptr

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

共享指针实现引用计数,弱指针不影响引用计数,如果你没有共享指针指向一个对象,只有弱指针,对象被删除,弱指针现在告诉你,对象已经丢失。

使用弱指针有两个原因:

  1. 为了消除引用计数增加/减less的成本; 但是你不应该这样做,因为它很容易出错,并不能真正节省很多时间
  2. 在簿记数据结构中,例如,您有一个“活着”所有对象Foo的索引,即在其他地方使用,并且如果所有“真实”用途都已结束,则不希望在索引中保留Foo。 这是弱点的基本现实用例。 当然也有其他的存在。

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

NB循环对象不需要弱指针,可以使用非熟的常规指针代替大多数正确构造的程序。 弱指针风险较小,但。

除非你试图实现一个垃圾回收器,否则你可能不应该试图使用弱指针,这在C ++中并不是一个热门的主意,因为很难跟踪所有可能发生错误的事情。