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 文档.
共享指针实现引用计数,弱指针不影响引用计数,如果没有对象的共享指针,只有弱指针,对象会被删除,弱指针现在会告诉您对象已丢失.
使用弱指针有两个原因:
所以一般来说,我建议只有在你知道要删除引用的对象并想要检测到它时才使用弱指针.在其他情况下使用共享指针(引用计数)或直接指针,尤其是.当您知道对象不会被删除时,在方法局部变量中.同样也是errorprone,但比共享指针更快.
NB循环对象不需要弱指针,你可以在大多数正确构造的程序中使用非熟的常规指针.然而,弱指针风险较小.
归档时间: |
|
查看次数: |
22580 次 |
最近记录: |