Out of Memory 的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 sunlinjun
  • 开始时间 开始时间
S

sunlinjun

Unregistered / Unconfirmed
GUEST, unregistred user!
Buffer为全局变量
Buffer:arrray[1..1024*1024]of char;

var
Temp:string;
begin
Temp:=copy(Buffer,2,7); //这里有时抛出Out of Memory的异常
end;

希望有各位大侠能解释一下,感激不尽!
 
Buffer为全局变量
Buffer:arrray[1..1024*1024]of char;

var
Temp:string;
begin
Temp:=copy(Buffer,2,7); //这里有时抛出Out of Memory的异常
end;

希望有各位大侠能解释一下,感激不尽!
 
var
Buffer:array[1..1024]of char;而是这里啊

Temp:string;
begin
Temp:=copy(Buffer,2,7); //这里没有抛出异常
end;
 
我把数组条小了,就没有问题
 
记不清《delphi精要》还是《源码分析》中有说
delphi有允许的数组最大说法,原因好像是分配的栈大小有最大值
当时没去试(认为一般没人能用到这么大)
有空再去翻一下看看
 
在一个过程里面定义的临时变量,内存是在栈里面分配的.栈默认的最大值是1M,当你定义
var
Buffer:array[0..1024*1024]的时候,就已经益处了.
不过我记得是错误是stack overflow,而不是out of memory
一本客户端程序报告这个的原因是因为你在直接或者间接调用GetMem的时候,传递了一个超过1.5G的值.
 
to NeutronDelphi:
1.5G?是操作系统允许分配的最大值?
 
var
Buffer : PChar;
temp : String;
begin
GetMem(Buffer,1024*1024);
Buffer := PChar('sdfdsafasdfasdfasdf');
Temp:=copy(Buffer,2,7);
FreeMem(Buffer);
end;
 
to uiit:应该不是,操作系统是4G的限制,如果是Advance Server设置3GB的标识的话,应用程序可以用3G的用户空间,1G的系统空间.不过这还要对编译好的EXE用PE工具进行设置支持大内存模式.
废话不多说,在普通情况下,我发现Delphi的程序,你申请内存超过1.45G就会报错,不信,你可以自己调试一下.
 
to NeutronDelphi:
我在《windows编程》的内存分配机制里看到过,但没有试过,谢谢
我认为没人去用申请那么大的东西
 
呵呵,我有时候,我写一些服务器程序,明显感觉到2GB的内存限制,局限性很大.调整到3GB以后,就有所缓解,当然对于大多数扑通程序而言,2GB的用户地址空间是足够了.
 
呵呵,内核本来就已经被压缩在2GB的空间里,使用/3GB开关,你就把它整1GB里了
委屈MS了
用64位嘿嘿
 
先说明一下出错的情况:
我的程序是一个基于TCP/IP的图像传输客户端程序,进行视频监控的,用的是ClientSocket组件.如果这个客户端运行的时间足够长,接收服务器的图像数很多的话,它就会抛出这个异常.后来将程序处于调试状态,发现长时间运行后,执行到
Temp:=copy(Buffer,2,7);
这里会抛出Out of Memory的异常.

Buffer它是的一个全局数组.专门用于接收TCP传过来的数据.我定义1M应该没有超出范围.

COPY函数在什么状态下会报这个错.?
 
建议你用Move把,不用 Copy
 
后退
顶部