IdHttp内存泄露问题(300分)

  • 主题发起人 主题发起人 Peter_Xiong
  • 开始时间 开始时间
P

Peter_Xiong

Unregistered / Unconfirmed
GUEST, unregistred user!
我用IDHttp控件获取网页内容,大概每两分钟一次.每次都是手工create对象,用完手工free
var
s: TStringStream;
IdHTTP1: TIdHTTP;

s := TStringStream.Create('');
IdHTTP1 := TIdHTTP.Create(nil);
IdHTTP1.ConnectTimeout := 10000;
IdHTTP1.ReadTimeout := 10000;
try
IdHTTP1.Get('http://xxx.xxx.xxx.xxx', s);
finally
s.Free;
IdHTTP1.Free;
end;

好像并没有free掉所有的内存.在windows的任务管理器中看到的已经使用的内存大概每隔小时就会多10M内存.但是进程的内存很正常,并没有增加,我只要关闭进程,windows中的已使用内存立刻下降很多.查过相关的资料,怀疑是IDHttp控件有内存泄露问题.要如何解决呢?
我用的IDHttp控件是9.0版的.不是delphi 6自带的.
 
var
s: TStringStream;
IdHTTP1: TIdHTTP;

s := TStringStream.Create('');
IdHTTP1 := TIdHTTP.Create(nil);
IdHTTP1.ConnectTimeout := 10000;
IdHTTP1.ReadTimeout := 10000;
try
IdHTTP1.Get('http://xxx.xxx.xxx.xxx', s);
//释放的之前调用一下
IdHttp1.Get('about:blank'); //会减少一些内存.但还是有泄露的.
finally

s.Free;
IdHTTP1.Free;
end;
 
IdHttp1.Get('about:blank');

这句会出错啊。
 
idhttp1.Get('about:blank');出什么错?
 
这种问题,用 aqtime 轻松就能找出来啊,另,推荐使用 FastMM4
 
我用了 FastMM4 后好像没有什么改善啊。
有没有哪个控件可以代替idhttp?
 
典型的客户端写法~~~~~~~~~
改用服务器端写法~~~~~~~~~

不要每次timer发生都create free
而是程序 create 和 close 时 create free

另外,接收数据 不一定用 stream 可以 用 string

try 可以加

try
try
idhttp1.get
....
except
end;
finally
end;

否则一旦出现网络错误,会死的难看.
 
同意樓上的。
 
var
s: TStringStream;
IdHTTP1: TIdHTTP;

s := TStringStream.Create('');
IdHTTP1 := TIdHTTP.Create(nil);
IdHTTP1.ConnectTimeout := 10000;
IdHTTP1.ReadTimeout := 10000;
try
IdHTTP1.Get('http://xxx.xxx.xxx.xxx', s);
finally
s.Free;
FreeAndNil(IdHTTP1);//---
end;

试试这样看看
 
回bsense,
我一开始的时候就是这样的,但是第二次打开网页(就是get(url))时就会报错了.
所以才每次都create和free.
另外内存泄露问题应该是idhttp,不是stream吧.所以用stream没有关系的吧

回jsjxuwenjun,
回去试试.

谢谢两位了.
 
我一般这样写:
var
s: TStringStream;
IdHTTP1: TIdHTTP;

s := TStringStream.Create('');
IdHTTP1 := TIdHTTP.Create(nil);
IdHTTP1.ConnectTimeout := 10000;
IdHTTP1.ReadTimeout := 10000;
try
try
IdHTTP1.Get('http://xxx.xxx.xxx.xxx', s);
except
FreeAndNil(s);
FreeAndNil(IdHTTP1);
end;
finally
FreeAndNil(s);
FreeAndNil(IdHTTP1);
end;
 
刚刚测试了一下,用了FreeAndNil情况依旧,几个小时后,内存占用多了100M.
还有什么办法呢?
 
修改源码:
destructor Destroy; override; //hjh add

...................................

destructor TIdSocksInfo.Destroy;
begin //hjh add...........原有内存漏
try
if FUDPSocksAssociation <> nil then FUDPSocksAssociation.Free;
except
end;
inherited;
end;
 
回ocean617,
TIdSocksInfo在那个文件上啊?
 
修改IdSocks.pas 文件,重新编译程序,好像没什么用啊?
时间长了还是占很多内存
 

Similar threads

后退
顶部