java - C++:普遍使用 shared_ptr<> 是否等同于 gc?

标签 java c++ garbage-collection smart-pointers

这只是一个学术问题(我永远不会在实际代码中这样做):

如果我要在我的代码中普遍使用 shared_ptr<>,其行为是否等同于像 Java 这样的 gc 收集语言?

如果不是,其行为与 gc 嵌入式语言有何不同?与 gc 嵌入式语言相比,哪种 C++ 构造会产生等效的行为?

注意:在实际编码中,我非常喜欢使用 RAII 和严格所有权,而不是使用任何智能指针。我也知道其他不太通用的指针 unique_ptr<> 会更有效率。这个问题只是对智能指针等价性的查询。

最佳答案

不,有几个重要的区别:

  • 只要有循环引用,就会发生内存泄漏。垃圾收集器可以处理循环,引用计数不能。
  • 您将避免任何停顿或暂停,因为不会发生垃圾收集。另一方面,您可能会花费更多的总 CPU 时间来清理资源,因为偶尔进行垃圾回收的摊销成本非常低,如果对所有内容都进行引用计数,则成本相对较高。

显然第一点是 killer 锏。如果您这样做,您的许多资源将不会被释放,并且您会泄漏内存并且您的应用程序将无法正常运行。

Which C++ construct would yield equivalent behavior compared to a gc-embedded language?

没有。 C++ 没有垃圾收集器,因为没有办法实现正确、可靠的垃圾收集器。 (是的,我知道 Boehm 的 GC,它是一个很好的近似值,但它是保守的,并且不会检测所有引用,只有它可以 100% 确定的引用。没有办法,在一般的 C++ 程序中, 实现一个 Just Works(tm)) 的垃圾收集器

关于java - C++:普遍使用 shared_ptr<> 是否等同于 gc?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7858228/

相关文章:

java - 使用 GET 重定向的 JSoup cookie 处理

c++ - 如何在初始化后更改数组元素

algorithm - 增量图算法

java - 删除单链表中间的节点

objective-c - 为 10.5+ 编写时我应该使用 Objective-C 垃圾收集吗?

java - 如何在 Spring Boot 中从属性文件读取正则表达式模式

java - 当我添加 @Async 时,entityManager.flush() 将引发异常

Java/hibernate : how to write DAO code for complex SQLs

c++ - 从 QMap 获取最后插入/添加的项目

c++ - 为什么 shiboken2 会忽略 C++11 风格的回调?