使用boost::shared_ptr进行赋值时的问题(与reset()函数相比)

9

很抱歉如果这个问题已经有明确的答案了,但我对boost文档和网上的文章感到有些困惑。

我看到可以使用reset()函数来释放shared_ptr中的内存(假设引用计数为零),例如:

shared_ptr<int> x(new int(0));
x.reset(new int(1));

我认为这将创建两个整数对象,到这两行结束时,等于零的整数将被从内存中删除。

但是,如果我使用以下代码块:

shared_ptr<int> x(new int(0));
x = shared_ptr<int>(new int(1));

显然,现在*x == 1是正确的,但原始整数对象(等于零)是否会从内存中删除或者我已经泄漏了该内存?

在我看来,这将是一个赋值运算符减少shared_ptr引用计数的问题,但是浏览源代码似乎不能为我解决这个问题。希望更有经验或知识的人能帮助我。提前致谢。

2个回答

15

文档写得很清楚:

shared_ptr & operator=(shared_ptr const & r); // 不会引发异常

效果:相当于 shared_ptr(r).swap(*this)

因此,它只是与您创建的临时对象互换所有权。然后,该临时对象过期,引用计数减少。(如果为零,则进行解除分配。)


这些容器的目的是不泄漏内存。所以,除非您故意想搞砸事情,否则不需要担心泄漏问题。(换句话说,你可能不需要怀疑Boost知道他们在做什么。)


我确实看到了这个,但是我还看到了可能存在冲突的其他信息。感谢您的审查。 - RandomGuy

5

您没有泄漏内存。第一个int对象的内存将被删除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接