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

zxc*_*bnm 6 c++ java boost memory-management

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

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

Ada*_*wen 11

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

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

在性能方面,共享指针也非常昂贵(至少与原始指针相比) - 但最好使用它们,然后在探查器识别出瓶颈而不是在任何地方使用它们时将其删除.

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

编辑:另一个问题(在提升页面上提到)是为了避免"临时"的shared_pointers:

func(A(), boost::shared_ptr<B>(new B));
Run Code Online (Sandbox Code Playgroud)

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

tmp1 = new B;
tmp2 = A();
tmp3 = boost::shared_ptr<B>(tmp1)
func(tmp2,tmp3)
Run Code Online (Sandbox Code Playgroud)

乍一看可能看起来不错,但是如果A()碰巧抛出一个异常,那么B已被分配,但是shared_ptr还没有得到它,所以指针永远不会被释放.


CB *_*ley 6

你可以做到这一点,但这通常是一个坏主意.首先,您可能会失去您认为可能获得的部分或全部效率.

更重要的是,听起来您正试图避免设计代码.Java有gc,所以你不必担心内存管理,但你仍然应该关注对象的生命周期.如果你不清楚谁拥有你最终可能会遇到混乱的设计.

在对象生命周期中,C++为您提供了许多选项,而不是每个复杂的对象都需要在堆上进行分配.shared_ptr应该用于需要共享所有权的对象(顾名思义),但这应该是一个积极的设计决策.如果不需要共享或可转让的所有权,则有更好的方法来拥有对象.