procedure TForm1.btn1Click(Sender: TObject);
var
i:int64;
x:array of int64;
intS:int64;
begin
i:=1000000000;
setlength(x,i); //此处报错
intS:=gettickcount;
Randomize;
i:=0;
while i<= high(x) do
begin
x[i]:=random(high(x)+1);
i:=i+1;
end;
intS:=gettickcount-ints;
lbl1.Caption:='用时'+inttostr(ints)+'毫秒';
end;
5 个解决方案
#1
1G个Int64也就是至少8G内存才够放.
如果你是32位操作系统至少操作系统给每个进程的内存只有2G或者3G(开了PAE模式)
如果是64位系统,你的物理内存也没这么大.
而你这里setlength报Range错主要是因为超出了动态数组的大小,动态数组32位系统最多是2G内存
neededSize := newLength*elSize;//32位系统下neededSize 是32位整数,你这个超出了最大数,就变成负数.后面那句就会抛异常.
if neededSize div newLength <> elSize then
Error(reRangeError);
如果你是32位操作系统至少操作系统给每个进程的内存只有2G或者3G(开了PAE模式)
如果是64位系统,你的物理内存也没这么大.
而你这里setlength报Range错主要是因为超出了动态数组的大小,动态数组32位系统最多是2G内存
neededSize := newLength*elSize;//32位系统下neededSize 是32位整数,你这个超出了最大数,就变成负数.后面那句就会抛异常.
if neededSize div newLength <> elSize then
Error(reRangeError);
#2
setlength(x,i); i为Integer
#3
x:array of int64; 报错Range check Error
x:array of integer; 报错Range check Error
x:array of smallint; 报错out of memory
同样是超出内存,为何前二者报 range check error 而后者报 out of memory
#4
x:array of integer; 报错Range check Error
x:array of smallint; 报错out of memory
x:array of byte; 正常
个人理解,第一种可能是语法检查层面的错误
第二种是语法通过但分配内存时发现不足
x:array of smallint; 报错out of memory
x:array of byte; 正常
个人理解,第一种可能是语法检查层面的错误
第二种是语法通过但分配内存时发现不足
#5
跟内存大小有关
#1
1G个Int64也就是至少8G内存才够放.
如果你是32位操作系统至少操作系统给每个进程的内存只有2G或者3G(开了PAE模式)
如果是64位系统,你的物理内存也没这么大.
而你这里setlength报Range错主要是因为超出了动态数组的大小,动态数组32位系统最多是2G内存
neededSize := newLength*elSize;//32位系统下neededSize 是32位整数,你这个超出了最大数,就变成负数.后面那句就会抛异常.
if neededSize div newLength <> elSize then
Error(reRangeError);
如果你是32位操作系统至少操作系统给每个进程的内存只有2G或者3G(开了PAE模式)
如果是64位系统,你的物理内存也没这么大.
而你这里setlength报Range错主要是因为超出了动态数组的大小,动态数组32位系统最多是2G内存
neededSize := newLength*elSize;//32位系统下neededSize 是32位整数,你这个超出了最大数,就变成负数.后面那句就会抛异常.
if neededSize div newLength <> elSize then
Error(reRangeError);
#2
setlength(x,i); i为Integer
#3
x:array of int64; 报错Range check Error
x:array of integer; 报错Range check Error
x:array of smallint; 报错out of memory
同样是超出内存,为何前二者报 range check error 而后者报 out of memory
#4
x:array of integer; 报错Range check Error
x:array of smallint; 报错out of memory
x:array of byte; 正常
个人理解,第一种可能是语法检查层面的错误
第二种是语法通过但分配内存时发现不足
x:array of smallint; 报错out of memory
x:array of byte; 正常
个人理解,第一种可能是语法检查层面的错误
第二种是语法通过但分配内存时发现不足
#5
跟内存大小有关