在我当前的项目中我正在使用 boost::shared_ptr 相当广泛。

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

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

有帮助吗?

解决方案

总的来说,

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

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

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

  • 您可以访问它,但它不是您的。
  • 如果对象不存在,您已定义行为

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

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

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

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

从根本上说,我想说,boost 共享指针库可以让您不会把程序组合在一起,但它不能替代花时间正确设计指针、对象所有权和生命周期。如果您有这样的设计,您可以使用该库来强制执行它。如果您没有这样的设计,您可能会遇到与以前不同的问题。

其他提示

在创建对象包含的循环引用,即weak_ptr一个对象与shared_ptr回自己使用shared_ptr。这是因为shared_ptr不能处理循环引用 - 当两个对象超出范围,相互引用意味着它们不是“垃圾回收”,所以内存丢失,你有内存泄漏。由于weak_ptr不增加引用计数,不发生周期性的基准问题。这也意味着在一般的,如果你只是想用一个指针指向的东西是引用计数,不希望增加其引用计数,然后使用weak_ptr

,否则,可以使用shared_ptr

有关的更多信息,检查升压文档

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

有使用一个弱指针两个原因:

  1. 要消除的参考计数增加/减少的成本;但是,你不应该这样做,因为这是容易出错,而且并没有真正节省很多时间
  2. 在簿记数据结构,例如您有其它地方使用的所有对象的Foo是“活着”,即一个索引,你不想让一个Foo活着索引如果所有的“真实”的使用已经结束。这是基本的现实情况下,使用弱指针。当然他人也存在。
  3. 所以一般来说,我的建议是,只有当你知道你想让引用的对象被删除,要检测使用弱指针。在其它情况下使用共享指针(引用计数),或直接指针,电除尘器。在方法的局部变量,当你知道这些对象都不会被删除。也容易出错,虽然,但快于共享指针。

    N.B。周期性对象不需要弱的指针,你可以在最正确构造程序使用非熟,普通指针来代替。弱指针风险较小,虽然。

您可能不应该尝试,除非你试图执行垃圾收集,这是不是在C热想法++,因为它太难跟踪所有可能出错不够紧密,使用弱指针在所有

scroll top