【问题标题】:Memory Leak in a list of pointers to objects指向对象的指针列表中的内存泄漏
【发布时间】:2012-09-25 14:12:04
【问题描述】:

我有一个指向对象的指针列表。

 std::list<X*> xList;

我需要的只是列表的大小,所以我的方法填充这个列表并在其上调用 size() 然后返回大小。

注意:我知道这不是最好的解决方案,但我使用的 API 提供了一个包含动态分配对象的列表,这是我能做到的唯一方法。

现在 valgrind 说这里存在内存泄漏。我假设这是因为我从不删除列表中的对象。

我想我会这样做:

std::list<X*>::iterator iter;
for (iter = xList.begin(); iter != xList.end(); ++iter)
{
    delete (*iter);
}

但这是最好的解决方案吗?

【问题讨论】:

  • 使用智能指针会是更好的解决方案。
  • 我认为您不能以这种方式删除元素(在使用该迭代器进行迭代时)。
  • @dbrank0: 删除迭代器引用的对象完全没问题。
  • 如果您只需要尺寸,为什么还要填写列表?为什么不只计算您添加项目的次数?
  • 如果您只需要大小,为什么要填充一个充满动态分配对象的列表?

标签: c++ memory-leaks


【解决方案1】:

不,最好的解决方案是使用std::list&lt;std::unique_ptr&lt;X&gt;&gt;。现在,对象会在适当的时候自行删除,您不必担心它。当std::list被销毁时,它所拥有的X对象也被销毁。

【讨论】:

    【解决方案2】:

    但这是最好的解决方案吗?

    不,最好的解决方案是使用std::list&lt;std::shared_ptr&lt;X&gt; &gt;

    【讨论】:

    • 感谢您的快速回复。能详细点吗?
    • @Kam 你知道什么是智能指针吗? std::shared_ptr?查一下。它为动态分配的对象提供自动内存管理。
    • 抱歉,我明白了,我想知道您为什么专门为这个问题选择了 shared_ptr。谢谢。
    • @Kam 以防共享所有权。没有其他原因。如果可以,请使用unique_ptr
    猜你喜欢
    • 2013-04-06
    • 1970-01-01
    • 2013-02-10
    • 2019-04-18
    • 1970-01-01
    • 2017-03-10
    • 2017-11-30
    • 2011-07-09
    • 2013-11-30
    相关资源
    最近更新 更多