缓冲字节长1MB的问题

时间:2011-07-02 17:15:53

标签: delphi file memory-management

因为我可以解决这个问题:我想使用1 MB或更多字节的缓冲区,因为我有堆栈overlflow,所以不可能使用数组。我已经考虑过getmem和freemem,或者使用tmemorystream,但是并没有真正理解为解决它。对我来说,需要使用缓冲区来使用带有读/写的tfilestream来复制文件。 我不希望在内存中一次性加载一切都很好,并且在将它写入磁盘之后也是如此;为此,我找到了解决方案,但不需要我。 非常感谢。丹妮拉。

3 个答案:

答案 0 :(得分:3)

如果您有堆栈溢出,那么您的变量不适合堆栈。您显然正在使用局部变量。

使用堆来解决问题。 GetMemSetLength

答案 1 :(得分:2)

一个简单的解决方案是使用动态数组。他们的数据在堆上分配,因此您将避免堆栈溢出。它们直接使用内存分配函数的优点是它们被重新计数,并且一旦最后一个引用超出范围,它们分配的内存将自动释放。

var buffer:array of byte;
begin
  SetLength(buffer,100000);
  ...
  //Will be freed here as buffer goes out of scope
end;

答案 2 :(得分:0)

您的缓冲区变量在堆栈上分配,Delphi编译器使用的默认最大堆栈大小为1 MiB。所以解决方案是通过使用项目选项或以下全局指令设置更高的限制:

{$MAXSTACKSIZE 4194304} // eg. now maximum is 4 MiB 

其他方式是使用堆而不是堆栈,任何动态分配的内存,在你的情况下最好的解决方案可能是动态数组。

性能说明:堆栈比堆快。