Huge strings and out of memory(100分)

  • 主题发起人 主题发起人 fanronghua
  • 开始时间 开始时间
F

fanronghua

Unregistered / Unconfirmed
GUEST, unregistred user!
Hi

I have a simple application containing this code:
---
var s : string;
begin
setlength(s, 1024*1024*512);
showmessage('ok');
setlength(s, 1024*1024*1024);
showmessage('ok');
...
---

The problem is that Delphi spits our an 'Out of Memory' error even though
there's more than 1.2GB free memory available

On the other hand, this code works fine:
---
var s : string;
begin
setlength(s, 1024*1024*1024);
showmessage('ok');
...
---

So it seems like Delphi creates a whole new memory allocation containing
'1024*1024*1024' bytes before unassigning any of the previosuly assigned
'1024*1024*512' bytes.

Is there a work-around for this, so I can make the first code example above
work?

Thanks in advance
Simon
 
》》》》》》》》》》》》》》》
 
呵呵,偶 e 文很烂,看你的 id chinese 吧,我来说说:
因为 delphi 中 setlength 一个字符串开辟的是连续的内存空间
而一个 win32 进程可用空间有 2g-3.3g(ms 宣称的理想的 4g),其中不一定存在连续的内存空间供你使用:比如,有些 dll 之类的的 imagebase 故意定在 1g 上,可能另一些定在 1.5g 等等,这导致你无法开辟两个 1g 的持续内存空间(因为 windows 进程空间的 flat 特性,所有 code、data 之类的都在一起,现在被 dll 之类的“隔断”了)
btw:2003 server 就专门对 dll 的 imagebase 做了设置,最大限度的保证用户态的连续内存空间。你上面的代码很可能在 windows server 2003 上能运行成功。
;>
 

Similar threads

A
回复
0
查看
607
Andreas Hausladen
A
A
回复
0
查看
933
Andreas Hausladen
A
A
回复
0
查看
806
Andreas Hausladen
A
A
回复
0
查看
469
Andreas Hausladen
A
后退
顶部