【问题标题】:Memory leak in using a list of lists使用列表列表时的内存泄漏
【发布时间】:2011-05-31 22:56:12
【问题描述】:

我收到了一些代码来“生产”。我运行了一个内存泄漏检查器,它在下面的“for”循环中调用以下行作为内存泄漏。

someStruct->arrayMap = new std::list<BasisIndex>*[someStruct->mapSizeX];
for(int i=0; i<someStruct->mapSizeX; i++){  
    someStruct->arrayMap[i] = new std::list<BasisIndex>[someStruct->mapSizeY];
}

数组映射的声明方式如下:

struct SomeStruct{
    int mapSizeX;
    int mapSizeY;
    std::list<BasisIndex>** arrayMap;
};

以下是它的几种用法:

someStruct->arrayMap[xVal][yVal].push_back(tempIndex);

for(it = someStruct->arrayMap[xVal][yVal].begin(); it != someStruct->arrayMap[xVal][yVal].end(); it++){
    ...
}

内存泄漏检查器在我杀死它之前转储了 5 分钟。然后我在清理例程中添加了以下代码,但它仍然转储出 150 个警告,所有警告都指向顶部 for 循环中的代码行。

for(int x=0; x<someStruct->mapSizeX; x++){
    for(int y=0; y<someStruct->mapSizeY; y++){
        someStruct->arrayMap[x][y].clear();
        someStruct->arrayMap[x][y].~list();
    }
}

std::list<BasisIndex> ** temp = someStruct->arrayMap;
delete temp;

如何彻底删除与此数组映射关联的内存?

【问题讨论】:

  • 改用std::vector&lt;std::vector&lt;std::list&lt;T&gt; &gt; &gt;。使用new 分配 STL 容器是可怕的。 (我所说的可怕是指杀死可怕的小狗)
  • @Billy:实际上情况更糟。它正在杀死小猫!
  • 我没有太多使用这些容器的经验。为什么这是一个糟糕的做法?这段代码需要尽可能快,但内存使用不是问题。谢谢
  • 因为没有理由动态分配它们。改为使它们成为自动变量。这与容器无关,但通常与 C++ 中对象的使用方式有关。如果你在现代 C++ 中一直在搞乱指针,那就有问题了。这就是scoped_ptrunique_ptrshared_ptrauto_ptr 和朋友们的目的。 (当然,如果您要与一些总是不同的 C API 交互;))
  • 当您使用它时,您可能会更喜欢std::vector 而不是std::list

标签: c++ memory-leaks stdlist


【解决方案1】:

以与分配对象相反的顺序释放对象。

分配:

someStruct->arrayMap = new std::list<BasisIndex>*[someStruct->mapSizeX];
for(int i=0; i<someStruct->mapSizeX; i++){  
    someStruct->arrayMap[i] = new std::list<BasisIndex>[someStruct->mapSizeY];
}

解除分配:

for (int i=0; i<someStruct->mapSizeX; i++){
    delete[] someStruct->arrayMap[i];
}
delete[] someStruct->arrayMap;

【讨论】:

  • 当然可以。如果你先delete[] someStruct-&gt;arrayMap,你怎么去delete[] someStruct-&gt;arrayMap[i]
  • 是的,这是真的——这很重要。但是,您可以按任何顺序对someStruct-&gt;arrayMap[i]s 进行核对。不必是分配它们的相反顺序。
  • 我知道我们互相误解了。 =)
【解决方案2】:

someStruct-&gt;arrayMap[x][y].~list(); delete。

【讨论】:

    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 2011-12-24
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多