procedure getipl;
var
ado:TADOQuery;
begin
ado:=TADOQuery.Create(nil);
ado.Connection :=Form1.ADOConnection1;
Form1.ADOConnection1.Connected :=True;.......
ado.free;
//freeandnil(ado); 这个也不行
end;
用try... finally最后释放也不真正释放,执行多次这个过程程序占用内存就一直增加真是郁闷,怎么回事呢?
var
ado:TADOQuery;
begin
ado:=TADOQuery.Create(nil);
ado.Connection :=Form1.ADOConnection1;
Form1.ADOConnection1.Connected :=True;.......
ado.free;
//freeandnil(ado); 这个也不行
end;
用try... finally最后释放也不真正释放,执行多次这个过程程序占用内存就一直增加真是郁闷,怎么回事呢?
解决方案 »
- TOpenDialog的filter是string类型,只有255长度不够用怎么办?
- 用鼠标点击DBgrid以后,再点“增加”按钮,这个时候会使DBgrid中的最后一条记录处于编辑状态,只有点“取消”后再点“增加”才能增加新的记录,怎样避免这种情况,先谢了
- 请问即时消息提醒,因该怎么做
- 我的学习计划。大家给点意见吧!
- DBGrid是否能实现在最前方显示复选框
- 我有一个表,由几个字段构成,但是我想使用永久字段,除了生成固有的字段之外,增加一个计算字段,不用在IDE下用代码如何实现?
- 如何把delphi6中的报表预览窗口 提示变为中文??
- 打听一个函数。
- 字符串变量如何转换为计算表达式?
- .net 本质论
- 100分,线程中的定时器如何正常工作?
- 有没有人跟我一样感觉一到年底就特别困,特别不想做事!
谢谢你,我用了个线程执行这个过程99次,内存真的像你说的那样,增加到一定程度就不再增加了
不过这个过程在其他过程里调用,然后执行调用它的过程199次,发现内存一直在增加,郁闷啊我的代码是这样,一个全局的stringlist保存数据库里的记录序号,然后随机打乱序号后,读入打乱后的序号,然后把每个序号对应的数据库记录重新读入到一个临时的数据库表里,最后又从临时数据库表读入数据重新写到数据库,这样就完成随机排序function ranip(list:string):string ;
var
tls1,tls2:TStringList;
i,i2:Integer;
ado,ado2:TADOQuery;begin
tls1:=TStringList.Create;
try
tls2:=TStringList.Create;
try
tls1.Text :=ipidlist.Text;
for i:=0 to tls1.Count-1 do
begin Randomize;
i2:=Random(tls1.Count);
if i2= tls1.Count then i2:= tls1.Count-1;
tls2.Add(tls1.Strings[i2 ] );
tls1.Delete(i2);
end;
//Form1.Memo6.Text :=sidlistid.Text+'|'+tls2.Text; ado:=TADOQuery.Create(nil);
try
ado.Connection :=Form1.ADOConnection1;
Form1.ADOConnection1.Connected :=True;
ado2:=TADOQuery.Create(nil);
try
ado2.Connection :=Form1.ADOConnection1;
Form1.ADOConnection1.Connected :=True;
ado.SQL.Text :='delete from tmpiplist';
ado.ExecSQL;for i:=0 to tls2.Count -1 do
begin
ado2.SQL.Text :='select * from '+'iplist'+' where id='+tls2.Strings[i] ;
try
ado2.Active:=True;
except
try
ado2.Active:=True;
except
end; end;if ado2.RecordCount <>0 then
begin
ado.SQL.Text :='insert into '+'tmpiplist'+' (ip,ipport,speed,atime,who,https)values('''+ado2.FieldValues['ip']+''','''+ado2.FieldValues['ipport']+''','''+ado2.FieldValues['speed']+''','''+ado2.FieldValues['atime']+''','''+ado2.FieldValues['who']+''','''+ado2.FieldValues['https']+''')';
ado.ExecSQL;
end;
end; ado.SQL.Text :='delete from iplist';
ado.ExecSQL;ado2.SQL.Text :='select * from '+'tmpiplist'+' where id';
try
ado2.Active:=True;
except
try
ado2.Active:=True;
except
end; end;for i:=1 to ado2.RecordCount do
beginado.SQL.Text :='insert into '+'iplist'+' (ip,ipport,speed,atime,who,https)values('''+ado2.FieldValues['ip']+''','''+ado2.FieldValues['ipport']+''','''+ado2.FieldValues['speed']+''','''+ado2.FieldValues['atime']+''','''+ado2.FieldValues['who']+''','''+ado2.FieldValues['https']+''')';
ado.ExecSQL;
ado2.FindNext;
end;
// MessageBox (0,'','',MB_OK );
getipl;
finally
ado2:=nil;
ado2.free;
end;
finally
ado:=nil;
ado.Free;
end;
finally
tls2:=nil;
tls2.free;
end;
finally
tls1:=nil;
tls1.Free;
end;end;
ado2.free;
end;
finally
ado:=nil;
ado.Free;
end;
finally
tls2:=nil;
tls2.free;
end;
finally
tls1:=nil;
tls1.Free;
end;
----------------
说说你吧 看了你这能把人弄疯了ado1:=nil;//你都把ado1指针指空了那你下面释放ado1指向的内存就是空 而原先的ado1指针指向的内存并没有释放
ado1.free;//释放啥 没用freeandnil(ado1);
或者ado1.free;
ado1:=NIL;
currentMinWorkingSetValue, currentMaxWorkingSetValue: DWORD; //当前进程工作区大小EndHandle := GetCurrentProcess();
if GetProcessWorkingSetSize(EndHandle, currentMinWorkingSetValue, currentMaxWorkingSetValue) then
begin
SetProcessWorkingSetSize(EndHandle, currentMinWorkingSetValue, currentMaxWorkingSetValue);
end;
呵呵,我开始是直接ado.free的,也试了freeandnil(ado);最后看到其他朋友说先nil,然后再free.所以就是这个代码,不过按你说的不nil直接free,内存虽然不断增加,但是都是增加的很小
public
destructor Destroy; override;
end;
destructor Test.Destroy;
begin
ShowMessage('Destroy');
inherited;
end; 调用
var
T1: Test;
begin
T1 := Test.Create;
T1 := nil;
T1.Free;很明显, 析构函数不会被调用VCL TOBJCET Free的源代码procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;在不等于nil的情况下才会调用 Destroy
ado:=nil;这个说得对,试后给出答案行不行吧
还是一样,内存一直增加,但是增加量不大
编译提醒ado:=nil; never used我的代码是这样,一个全局的stringlist保存数据库里的记录序号,然后随机打乱序号后,读入打乱后的序号,然后把每个序号对应的数据库记录重新读入到一个临时的数据库表里,最后又从临时数据库表读入数据重新写到数据库,这样就完成随机排序