我制作了大约有40个列表框的应用程序。我有无限的for循环,一直是这些列表框中的ADD,DELETE或CHANGE项。经过一段时间约2小时的添加,更改和删除项目后,我收到“堆栈溢出”错误消息,应用程序停止。我在互联网上看到它是记忆的东西。我在任务管理器中看到我的应用程序的内存使用量正在增长和增长,但它从未减少。我认为我的应用程序永远不会释放内存,所以这就是问题所在。但我不能免费列表框,因为当我免费列表框它消失了。我没有在互联网上找到任何解决方案。抱歉英语不好,我想你可以理解我。谢谢。
此示例代码导致“Stack Overflow”错误。 Picture
procedure TForm1.BeginLoopClick(Sender: TObject); //begin the process
var
i,p:integer;
s:string;
begin
listbox1.Clear;
for i:= 1 to 10 do
begin
listbox1.Items.Add(IntToStr(i));
if i= 7 then
begin
listbox1.Items[0]:='5';
listbox1.Items.Delete(6);
listbox1.Items.Delete(5);
listbox1.Items.Delete(4);
listbox1.Items.Delete(3);
CallBeginLoopClick(sender);
end;
end;
end;
procedure TForm1.CallBeginLoopClick(Sender: TObject);
begin
BeginLoopClick(sender);
end;
答案 0 :(得分:1)
让我们以伪步骤运行您的代码:
1. Clear content
2. Add items 0 - 6, with data '1' - '7'
3. Change item 0's data into '5'
4. Delete item 3 - 6
5. There are three items left: 0 - 2 with data '5', '2', '3'
6. Goto step 1.
你能得出的唯一结论是这段代码将永远运行,因为没有逃避:
1. Clear content
2. Add items 0 - 6, with data '1' - '7'
3. Change item 0's data into '5'
4. Delete item 3 - 6
5. There are three items left: 0 - 2 with data '5', '2', '3'
6. Clear content
7. Add items 0 - 6, with data '1' - '7'
8. Change item 0's data into '5'
9. Delete item 3 - 6
10. There are three items left: 0 - 2 with data '5', '2', '3'
11. Clear content
12. Add items 0 - 6, with data '1' - '7'
13. Change item 0's data into '5'
14. Delete item 3 - 6
15. There are three items left: 0 - 2 with data '5', '2', '3'
16. etc...
这些步骤中缺少的步骤是对BeginLoopClick
的调用。例程调用自己(通过另一个rutine),称为递归。所有这些电话都被记住了,因为没有人会结束。这就是你的堆栈溢出的原因(可能是像Windows Listbox内部组件一样)。