例如:
先定义一个结构体
Type
  Ttest = record
   id:dword;
   name:string;
   ege:word;
   memo:string;
end;var
Atest: array of ttest;
i:integer;
begin
 i:=0;  isstop:=false;
 while isstop<>true do
   begin
      application.ProcessMessages ;
      inc(i);
      setlength(atest,i);
      atest[i-1].id:=i;
      Atest[i-1].name:='张三';
      Atest[i-1].ege:=20;
      Atest[i-1].memo:='这是一个测试'  ;
      edit1.text:=inttostr(i);
   end;
end;
//这样动态定义Atest的长度,我机器跑17000多次就会报错 Out Of Memory
var
 Atest: array of ttest;
 i,j:integer;
begin
 i:=0;  isstop:=false;
 j:=100000;
 setlength(Atest,j)   ;
 while i<j do
   begin
      application.ProcessMessages ;
      inc(i);
      atest[i-1].id:=i;
      Atest[i-1].name:='张三';
      Atest[i-1].ege:=20;
      Atest[i-1].memo:='这是一个测试'  ;
      edit1.text:=inttostr(i);
   end;
end;
//这样一次设置成100000,都不会报错请问大家 是如何解决频繁setlength后报内容溢出错误的没有分了,都给了

解决方案 »

  1.   

    setlength(atest,i);太频繁,导致内存碎片太多!
      

  2.   

    确实不知道总数,可以每次增加50%(不足1000算1000),不够再增加
    这样能大大减少setlength次数
      

  3.   

    to sz_haitao 
    您说的就是我第二种,我只是想知道,有什么方法可以解决第一种方法里的内存溢出错误
      

  4.   

    你这种应该使用TList
      

  5.   


    你这种是内存碎片太多,其实总数不算多
    你第二种是一次性准确开辟空间
    我说的方法是不知道准确空间,但是也使得内存碎片不会太多
    Tlist也会类似我的做法,所以碎片不会太多
      

  6.   

    看到这突然想到个问题:
    SetLength重复开辟空间的时候,如果空间里有数据,不会清空的吧?
      

  7.   

    WIN764 XE3我在我机器上运行到2.2千万多才出错.提交内存达到了1.6G
    编译成64位程序,由于64位内存可访问总量太大,我等了几分钟也没出现内存不够用,就结束程序了.改用TList<T>或者TList存放结构体指针结果更差只有1.6千万个以我的机器为例,2.2千万的时候实际上在setlength的时候最高峰有4.4千万这个结构体存在.内存吃不消也属正常.象楼主这种方式内存终有穷尽的时候,如果真的需要巨大的数据量一般不会全部用内存处理的.举个例子SQLServer和Oracle等数据程序都必须放在磁盘上,内存也就是放一些索引和常用的缓冲.
      

  8.   

    用TList嘛,多简单啊。。
      

  9.   

    TList 或 用泛型
      

  10.   

    楼上的搞得都太复杂了,这样,不要使用record,你声明一个class从TCollectionItem继承,将你需要的item声明成field或property,使用TCollection而不是List来管理这些对象,这样内存使用效率比较高。