例如:
先定义一个结构体
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后报内容溢出错误的没有分了,都给了
先定义一个结构体
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后报内容溢出错误的没有分了,都给了
解决方案 »
- exception class EInouterror with message 'I/O erro 103'这样的错误是什么原因啊?
- cxLookupCombobox控件,ListColums有两个,如何取得两列对应的值
- 自由报表打印如何实现
- 有做his的南京朋友吗?
- 高手们,不要吝惜笔墨,关于TStringGrid控件,给两百分
- 要求用户可以任意输入线程数,然后根据用户输入的数字创建任意个相同线程
- 一个简单的问题,关于调用同一程序中,另一个窗口的EDIT1值的疑惑???
- select hh,sum(sl) from hw group by hh 为什么不可以?
- panel的使用
- *.dcu控件的安装
- delphi7 如何做一个discuz论坛登陆器
- 网站宣传用友二次开发是否侵权
这样能大大减少setlength次数
您说的就是我第二种,我只是想知道,有什么方法可以解决第一种方法里的内存溢出错误
你这种是内存碎片太多,其实总数不算多
你第二种是一次性准确开辟空间
我说的方法是不知道准确空间,但是也使得内存碎片不会太多
Tlist也会类似我的做法,所以碎片不会太多
SetLength重复开辟空间的时候,如果空间里有数据,不会清空的吧?
编译成64位程序,由于64位内存可访问总量太大,我等了几分钟也没出现内存不够用,就结束程序了.改用TList<T>或者TList存放结构体指针结果更差只有1.6千万个以我的机器为例,2.2千万的时候实际上在setlength的时候最高峰有4.4千万这个结构体存在.内存吃不消也属正常.象楼主这种方式内存终有穷尽的时候,如果真的需要巨大的数据量一般不会全部用内存处理的.举个例子SQLServer和Oracle等数据程序都必须放在磁盘上,内存也就是放一些索引和常用的缓冲.