在我的当前项目中,我广泛使用了boost::shared_ptr
。
最近,我的团队成员也开始使用weak_ptr
。我不知道应该在什么情况下选择哪个。
除此之外,如果我想将weak_ptr
转换为shared_ptr
,我该怎么做?通过对weak_ptr
进行锁定以创建shared_ptr
会影响到其他线程的代码吗?
在我的当前项目中,我广泛使用了boost::shared_ptr
。
最近,我的团队成员也开始使用weak_ptr
。我不知道应该在什么情况下选择哪个。
除此之外,如果我想将weak_ptr
转换为shared_ptr
,我该怎么做?通过对weak_ptr
进行锁定以创建shared_ptr
会影响到其他线程的代码吗?
当你创建的对象包含循环引用时,即使用 shared_ptr
指向一个具有返回指向自身 shared_ptr
的对象时,请使用 weak_ptr
。这是因为 shared_ptr
无法处理循环引用 - 当两个对象超出范围时,相互引用意味着它们不会被 "垃圾回收",因此会发生内存泄漏。由于 weak_ptr
不会增加引用计数,因此不会出现循环引用问题。这也意味着一般情况下,如果想要获取指向某个引用计数对象的指针并且不想增加其引用计数,则应使用 weak_ptr
。
否则,您可以使用 shared_ptr
。
欲了解更多信息,请查看 Boost 文档。
共享指针实现引用计数,弱指针不影响引用计数;如果您没有对对象拥有共享指针,只有弱指针,则该对象被删除,并且弱指针现在会告诉您对象已经丢失。
使用弱指针有两个原因:
因此,总体而言,我的建议是仅在知道要让所引用的对象被删除并希望检测到时才使用弱指针。在其他情况下使用共享指针(引用计数)或直接指针,特别是在方法局部变量中,当您知道对象不会被删除时。虽然也容易出错,但比共享指针更快。
注:循环对象不需要弱指针,在大多数正确构造的程序中可以使用非干扰型常规指针。弱指针风险较小。
如果你不是在尝试实现垃圾回收器,那么最好不要使用弱指针。在C++中实现垃圾回收器并不是一个好主意,因为很难密切跟踪可能出错的所有内容。