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

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

概述我用C/C++编写了一段时间,现在我需要为我正在做的项目提高效率. 我从这个shared_ptr中理解的是它在我需要它时基本上删除了对象.所以,例如,如果我的对象有一个shared_ptr的向量,我不必担心迭代向量并删除析构函数中的每个元素?换句话说,只要我使用这些,我就不用担心内存管理了吗?或者我完全误解了这个?这听起来好得令人难以置信. 您必须了解共享指针是使用引用计数实现的,这意味着如果指针 我用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 Boost shared_ptr进行编程,就像我在Java中编码一样,不关心内存管理?全部内容,希望文章能够帮你解决我是否可以使用C Boost shared_ptr进行编程,就像我在Java中编码一样,不关心内存管理?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1235926.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存