因为我可以解决这个问题:我想使用1 MB或更多字节的缓冲区,因为我有堆栈overlflow,所以不可能使用数组。我已经考虑过getmem和freemem,或者使用tmemorystream,但是并没有真正理解为解决它。对我来说,需要使用缓冲区来使用带有读/写的tfilestream来复制文件。 我不希望在内存中一次性加载一切都很好,并且在将它写入磁盘之后也是如此;为此,我找到了解决方案,但不需要我。 非常感谢。丹妮拉。
答案 0 :(得分:3)
如果您有堆栈溢出,那么您的变量不适合堆栈。您显然正在使用局部变量。
使用堆来解决问题。 GetMem
或SetLength
。
答案 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
其他方式是使用堆而不是堆栈,任何动态分配的内存,在你的情况下最好的解决方案可能是动态数组。
性能说明:堆栈比堆快。