垃圾收集与共享指针

hel*_*922 14 garbage-collection pointers shared-ptr

共享指针(例如boost :: shared_ptr或新的std :: shared_ptr)和垃圾收集方法(例如用Java或C#实现的那些)之间有什么区别?我理解它的方式,共享指针跟踪变量指向资源的次数,并在计数达到零时自动销毁资源.但是,我的理解是垃圾收集器还管理内存资源,但需要额外的资源来确定对象是否仍然被引用,并且不一定会立即破坏资源.

我的假设是否正确,使用垃圾收集器和共享指针之间是否存在其他差异?此外,如果有人执行类似的任务但性能数据不同,为什么有人会在共享指针上使用垃圾收集器呢?

Hen*_*man 16

那些共享指针(通常称为引用计数)存在循环风险.

垃圾收集(标记和扫描)没有这个问题.

  • 想象一下A拿着一个ptr到B和B指向A. (3认同)

Pla*_*ure 14

正如您所指出的,主要区别在于资源何时被释放/销毁.

GC可能派上用场的一个优点是,如果您拥有需要很长时间才能发布的资源.对于短暂的程序生命周期,最好让资源悬空并最终清理它们.如果达到资源限制,则GC可以采取行动释放其中一些限制.另一方面,共享指针在引用计数达到零时立即释放其资源.对于具有昂贵时间要求的资源的频繁获取 - 释放周期而言,这可能是昂贵的.

另一方面,在一些垃圾收集实现中,垃圾收集要求整个程序在检查,移动和释放内存时暂停其执行.有更聪明的实现,但没有一个是完美的.

  • 有无暂停,增量和并发垃圾收集器,不需要收集器中断mutator.此外,如文献所示,垃圾收集器通常在典型的增变器中比参考计数表现更好. (4认同)