【问题标题】:Memory leak in delete loop删除循环中的内存泄漏
【发布时间】:2011-09-17 01:48:33
【问题描述】:

“由于删除循环中的逻辑错误,您最终出现了一些内存泄漏。”

我朋友说了这个,我没看到。

for(int i=0; i<nrOfAvailableSeats; i++)
{
    delete passengers[i];
}
delete [] passengers;

【问题讨论】:

  • 我们需要更多代码。
  • passengers 数组的大小是多少? nrOfAvailableSeats 的值是多少?我们不是心灵感应的。
  • 关键问题:创建了多少passengerspassengers 数组有多大?
  • 这里是整个 .cpp 文件:dl.dropbox.com/u/3140142/FlightHandler.cpp
  • @Andres - " int nrOfAvailableSeats=100; " 没有任何意义。

标签: c++ memory-leaks delete-operator


【解决方案1】:

您从 nrOfAvailableSeats 设置为初始值 (100) 开始,然后在程序运行时它可能会递减(因为您有

nrOfAvailableSeats--;

在您的代码中),因此当您在循环中使用它时,您不会delete 某些对象。

至少你必须定义一个全局常量:

const int PlaneCapacity = 100;

并使用它来初始化nrOfAvailableSeats 以及在数组创建和删除循环中。

【讨论】:

  • 我添加了 const int MaxAvailableSeats=100;和 nrOfAvailableSeats=MaxAvailableSeats;在第 15 和 16 行,并将第 50 行更改为 MaxAvailableSeats。 dl.dropbox.com/u/3140142/FlightHandlerNEW.cpp
  • @Anders Andersson:太好了,现在这个问题必须解决了。
【解决方案2】:

这是因为您在删除部分元素后删除了一系列乘客。 因此,当您执行 delete [] passengers; 时,某些 ( [i], [i+1], ... ) 元素可能不会被删除。

【讨论】:

  • 仅当乘客数组的长度与 nrOfAvailableSeats 不同时。
  • 你怎么知道的?我们甚至不知道数组的大小或类型。
  • 嗯,它看起来 像一个变量,而不是一个常数,而且由于他不使用 sizeof pirouette 可以安全地假设最坏的情况,他目前没有提供完整的源代码答案。
【解决方案3】:

在链接文件中有代码:nrOfAvailableSeats--;

当您释放数据时,您可能会遇到 memleak,因为 nrOfAvailableSeats 可以是

【讨论】:

  • 如何修复内存泄漏?我对 C++ 和一般编程还很陌生。
  • 使用常量,例如:const int MaxAvailableSeats=100;,然后分配nrOfAvailableSeats=MaxAvailableSeats,完成后循环MaxAvailableSeats
  • 我已更改第 15、16 和 50 行。dl.dropbox.com/u/3140142/FlightHandlerNEW.cpp
  • 现在应该修复内存泄漏吗?
【解决方案4】:

您将所有可用席位初始化为 0/null,因此,在清理阶段,只需遍历所有 100 个元素并删除每个项目。 (编辑:在删除之前检查空指针是多余的,没关系。)

如果您被允许使用 STL,也可以使用 std::vector。 然后只需遍历向量并将它们全部删除,因为向量中只有实际使用它们的项目。 (如果您只使用 push 和 pop)。

要从正在使用的向量中删除某些内容(不会完全清空),是将要删除的项目替换为vector.back(),然后删除vector.back(),然后再删除pop_back()。 注意:这会使任何迭代器无效,您必须正确重新分配它们,或者如果您只想删除一项,只需通过breakreturn 跳出迭代循环。

#include "Passenger.h"
#include "EconomyClass.h"
#include "FirstClass.h"
#include <vector>



int main()
{
std::vector<Passenger*> passengers

//add passengers the vector grows when needed, it does so by copying the items, which, in the 
//case of raw pointers like this, fast.
passengers.push_back(new FirstClass(name, purpose, chair));
passengers.push_back(new EconomyClass(name, purpose, food));

//delete all, starting from the back of the stack
//check the std::vector reference online for details
std::vector<Passenger*>::reverse_iterator start,end;
start = passengers.rbegin();
end = passengers.rend();

//iterate through all items, in this case, 2
for(;start!=end;++start)
{
delete *start;
}
//optional since it would get called on cleanup anyway)
passengers.clear();

}

【讨论】:

  • 正如我之前所说,我是 C++ 新手,我们还没有完成您在上面发布的这种编程。
  • @Anders Andersson 啊,好吧,我明白了,是的,我会跳过所有 100 个项目并检查指针的有效性,只是为了确定,但我知道对于原始问题中为什么会出现内存泄漏,这并不是一个很好的答案。
  • 我认为内存泄漏现在在我的新文件中得到修复:dl.dropbox.com/u/3140142/FlightHandlerNEW.cpp
  • @Anders Andersson,确实,因为它正在这样做,所以遍历所有 100 个并将它们全部删除,虽然它不检查空指针,但现在我看到了,我想删除空指针没有什么坏处,所以我想检查毕竟是多余的。编辑:是的,这是多余的。
猜你喜欢
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 2016-01-13
  • 2018-05-13
相关资源
最近更新 更多