std :: list中动态分配的数组导致内存泄漏

时间:2010-11-27 20:10:29

标签: c++ arrays list memory-leaks std

以下代码会导致内存泄漏:

  std::list<float*> vertices; 

  float* v;
  for (int i = 0; i < 50000; i++){
      v = new float[3];
      v[0] = v[1] = v[2] = 13;

      vertices.push_back(v);
  }

  std::list<float*>::iterator curr;
  for(curr = vertices.begin(); curr != vertices.end(); curr++) {
      delete[] *curr;
  }

  vertices.clear();

我不知道它为什么会发生,但我想它与std :: list的一些异常有关。 更奇怪的是,如果我不止一次地运行代码,泄漏的内存量就不会改变。难道我错过了一些非常基本的东西吗?
任何人都可以提出这个理由吗?我可以只用更改代码的破坏部分来解决这个问题吗?

更多信息:
这是一个mfc应用程序。代码在按下按钮时执行。在我按下按钮之前,我在任务管理器中看到15mb。按下按钮后,我看到40mb。该按钮只执行此代码。

2 个答案:

答案 0 :(得分:6)

您错误地解释了结果。您看到的“泄漏”实际上并不是泄漏,而是预分配,这基本上是CRT或STL保持分配内存的地方,因为您需要再次使用它以便更快地分配时间。

此外,你应该真的,真的使用自我释放指针。它们保证永远不会泄漏内存,如果它们使用得当,并且在Boost或新编译器的标准库中有很多编写良好的智能指针。

编辑:任务管理器不是衡量分配/解除分配等的可靠方法。这甚至不分配25MB。

更多编辑:您甚至不需要检查是否使用了正确的RAII指针而不是原始指针。

答案 1 :(得分:3)

在您的代码中看不到任何内存泄漏......

你真的应该使用RAII,你不需要担心它......我猜这个std :: vector可能是更好的选择,因为你可能想要连续的记忆......

e.g。

typedef std::array<float, 3> vec3;
std::vector<vec3> vertices; 

for (int i = 0; i < 50000; i++)
{
    vec3 v = {13, 13, 13};
    vertices.push_back(v);
}  

vertices.clear();
相关问题