以下代码会导致内存泄漏:
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。该按钮只执行此代码。
答案 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();