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;

解决方案 »

  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);
      

  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;  正常个人理解,第一种可能是语法检查层面的错误
    第二种是语法通过但分配内存时发现不足