java - 我可以使用 C++ Boost shared_ptr 进行编程,就好像我在用 Java 编写代码一样,而不关心内存管理吗?

标签 java c++ memory-management boost

我用 C/C++ 编写代码已经有一段时间了,现在我正在做的项目需要它的效率。

我从这个 shared_ptr 中了解到,它基本上是在我需要时删除对象。因此,例如,如果我的对象有一个 shared_ptr vector ,我就不必担心遍历 vector 并删除析构函数中的每个元素了吗?也就是说,我只要用这些就不用担心内存管理了?还是我完全误解了这一点?听起来好得令人难以置信。

最佳答案

你必须明白共享指针是使用引用计数实现的,这意味着如果你的指针图中有循环,那么对象将不会被释放。也就是说,如果 a 指向 b,b 指向 a,但没有任何东西指向 a 或 b,那么 a 和 b 都不会被释放,因为它们的引用计数都是“1”。

Boost 提供了弱指针来解决这个问题,它允许您存储指向共享对象的指针而不增加其引用计数。弱指针提供了一个安全层,因为在释放共享指针后尝试取消引用指针将引发异常而不是使程序崩溃。

共享指针在性能方面也相当昂贵(至少与原始指针相比)——但最好使用它们,然后在分析器识别出瓶颈后将其删除,而不是不在任何地方使用它们。

除此之外,是的,它们对于管理动态分配的对象非常有用。

编辑:另一个陷阱(在 boost 页面上提到)是避免“临时”shared_pointers:

func(A(), boost::shared_ptr<B>(new B));

因为允许编译器将其优化为

tmp1 = new B;
tmp2 = A();
tmp3 = boost::shared_ptr<B>(tmp1)
func(tmp2,tmp3)

乍一看可能没问题,但如果 A() 恰好抛出异常,则 B 已分配,但 shared_ptr 尚未获得它,因此指针永远不会被释放。

关于java - 我可以使用 C++ Boost shared_ptr 进行编程,就好像我在用 Java 编写代码一样,而不关心内存管理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2081738/

相关文章:

java - Spring 3.X Java 7 线程安全日期/数字格式注入(inject)

C++通用引用和LRef参数的类型推导

c++ - 为什么std::fetch_add返回旧值?

c++ - "bit padding"或 "padding bits"到底是什么?

c - 在这个简单的 C 程序中分配内存时我哪里出错了?

java - Jersey Web 服务和 hibernate 一对多映射

java - Java 中的时序困惑

java - Android Xml Pull 解析器错误 - SitesDownloadTask.onPostExecute

c++ - 如何让 clang 不替换 #define 宏

python - 在不同机器上分配大 ndarray 时出现 MemoryError 与 "ValueError: array is too big"