pointers - 垃圾收集与共享指针

标签 pointers garbage-collection shared-ptr

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

我的假设正确吗?使用垃圾收集器和共享指针之间还有其他区别吗?另外,如果有人执行类似的任务但性能指标不同,为什么他们会使用垃圾收集器而不是共享指针?

最佳答案

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

GC 可能派上用场的一个优势是,如果您拥有需要很长时间才能释放的资源。对于较短的程序生命周期,最好让资源悬空并最终清理它们。如果达到资源限制,则 GC 可以采取行动释放其中的一些资源。另一方面,一旦引用计数为零,共享指针就会释放其资源。对于具有昂贵时间要求的资源的频繁获取-释放周期来说,这可能成本高昂。

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

关于pointers - 垃圾收集与共享指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4663385/

相关文章:

C 编程,关于指针的困惑

c - 在尝试理解指针时,我有以下问题

C++ - 共享指针数组

c++ - static_pointer_cast 是否更新引用计数

c++ - std::map 中的对象指针在通过 getter 检索时损坏

java - "OutOfMemoryError: GC overhead limit exceeded": parse large json file with java

java - 如果在 "sleep"期间发生完整 GC,Thread.sleep 将如何表现?

c# - 我可以检测到垃圾收集在 .NET 中运行的时刻吗?

具有智能指针的 C++11 复合模式

c++ - 为什么在 C++ 中使用 "*(*(array + i) + j)"而不是 "array[i][j]"?