我用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还没有得到它,所以指针永远不会被释放.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。