Timer.Interval := 50;
在TTimer 的OnTimer事件中
begin
Args.NumDatas := 255;
GetMem(Args.pDataBlock, Args.NumDatas * sizeof(SDataBlock));
Data := TData.Create;
FList.Add(Data);
finally
FreeMem(Args.pColorCodeCCHDataBlock);
end;
end;
不知道为什么我只要加上
Data := TData.Create;
FList.Add(Data);
就会有内存泄露,应用程序的内存使用量不停的增加,而且速度特别快,绝对不止增加一个TData占用的内存。
而如果我把中间两句改成
Data := TData.Create;
Data.Free;
即把刚申请的内存释放掉,则一切正常。
不知道哪位老大遇到过这样的问题啊?
Data := TData.Create;
FList.Add(Data);
Data.Free;
或者可以用FreeAndNil(Data);
你是运用我觉得好惊讶的, 什么需求一定要求把内存分配动作放在在TTimer 的OnTimer事件中 !
这样可能系统还未释放就已经退出了这个事件
你这里的flist是什么类?
如果是TObjectList的对象,也许可以不释放保存的对象,其余的是需要手动释放的
在Timer事件中加入
Data := TData.Create;
FList.Add(Data);
这绝对是不可取的,因为你必须要手工去释放Flist中的所有对象。
随着时间的推移,内存中的对象越来越多
不明白楼主为什么要这么做?应该会有更好的方法。
下班了,公司断网了,明天再关注。
QQ:56096682
你用Timer不停的创建,也没见你释放啊!
当然不行了!
FList.Add(Data);
只是添加了一个指向数据的指针而已。
FreeMem(Args.pDataBlock);
仅仅释放了存放指针的数据空间,指针指向的数据并没有释放。
每次OnTimer你都FList.Add(Data);一次,内存怎么可能不增加?不明白你要干什么
那可能是由于你的 Timer.Interval := 50; 的缘故
释放这样试:
var
I: Integer;
begin
for I := 0 to aList.Count - 1 do
begin
TData(aList.Items[I]).Free
end;
end;
Data := TData.Create;
FList.Add(Data);
finally
FreeMem(Args.pColorCodeCCHDataBlock);
end;
这样写绝对有问题的!
改成
try
Data := TData.Create;
...
Data.close;
Data.Free;
finally
Exit;
end;
还有在onTimer里以时间间隔为50这样不停的创建,而不释放,那肯定会出现内存泄露的问题啦!
要么你在Timer.Interval := 50; 时释放一次,那就不会出现那问题啦!
楼上的方法没试,不过可以参考!
mark
在Ontimer事件中分配内存不是明智的做法