我是否可以使用C Boost shared_ptr进行编程,就像我在Java中编码一样,不关心内存管理?

我用C/C++编写了一段时间,现在我需要为我正在做的项目提高效率.

我从这个shared_ptr中理解的是它在我需要它时基本上删除了对象.所以,例如,如果我的对象有一个shared_ptr的向量,我不必担心迭代向量并删除析构函数中的每个元素?换句话说,只要我使用这些,我就不用担心内存管理了吗?或者我完全误解了这个?这听起来好得令人难以置信.

解决方法

您必须了解共享指针是使用引用计数实现的,这意味着如果指针图中有循环,则不会释放对象.也就是说,如果指向b和b的点指向a但没有指向a或b,那么a和b都不会被释放,因为它们都具有引用计数“1”.

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还没有得到它,所以指针永远不会被释放.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...