【问题标题】:question on assignment with boost::shared_ptr (vs. the reset() function)关于 boost::shared_ptr 分配的问题(与 reset() 函数相比)
【发布时间】:2010-09-13 00:53:47
【问题描述】:

很抱歉,如果在某处明确回答了这个问题,但我对我在网上阅读的 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 的引用计数的问题,但看一眼源代码似乎并不能解决我的问题。希望更有经验或知识渊博的人可以帮助我。提前致谢。

【问题讨论】:

    标签: c++ boost shared-ptr


    【解决方案1】:

    文档相当清楚:

    shared_ptr &amp; operator=(shared_ptr const &amp; r); // never throws

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

    所以它只是用你创建的临时对象交换所有权。然后临时过期,减少引用计数。 (如果为零则解除分配。)


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

    【讨论】:

    • 我确实看到了这一点,但后来我也看到了可能存在冲突的其他信息。感谢您的健全性检查。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多