Delphi内存释放的问题,在线急等!!!!!

TANG1981 2005-09-08 02:16:25
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;
即把刚申请的内存释放掉,则一切正常。

不知道哪位老大遇到过这样的问题啊?
...全文
642 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
TANG1981 2005-10-22
  • 打赏
  • 举报
回复
谢谢大家乐
仙侣步惊云 2005-10-18
  • 打赏
  • 举报
回复
在Ontimer事件中分配内存不是明智的做法
TANG1981 2005-10-18
  • 打赏
  • 举报
回复
up
TANG1981 2005-09-25
  • 打赏
  • 举报
回复
非常谢谢大家,不好意思,好久没来,因为有别的事,所以先把这个问题放下了,
可能大家没有看明白我的意思,再Timer里面的Data是不能释放的,是要缓存起来的,大家先把问题看清楚,在回答。
现在是估计,GetMem(Args.pDataBlock, Args.NumDatas * sizeof(SDataBlock));申请了内存
而FreeMem(Args.pColorCodeCCHDataBlock);的时候并没有把内存释放干净,就是说程序其实还是占用这块内存的,只有当程序退出的时候才会把它,彻底释放掉,不知道那位高手,能解释清楚,
看来该去补课了。。
grjs2004 2005-09-15
  • 打赏
  • 举报
回复
Data := TData.Create;
FList.Add(Data);


finally
FreeMem(Args.pColorCodeCCHDataBlock);
end;

这样写绝对有问题的!
改成
try
Data := TData.Create(nil);
...
Data.close;
Data.Free;
finally
Exit;
end;

还有在onTimer里以时间间隔为50这样不停的创建,而不释放,那肯定会出现内存泄露的问题啦!
要么你在Timer.Interval := 50; 时释放一次,那就不会出现那问题啦!

楼上的方法没试,不过可以参考!
abc3000 2005-09-15
  • 打赏
  • 举报
回复
mark
Larry1030 2005-09-09
  • 打赏
  • 举报
回复
那可能是由于你的 Timer.Interval := 50; 的缘故
释放这样试:
var
I: Integer;
begin
for I := 0 to aList.Count - 1 do
begin
TData(aList.Items[I]).Free
end;
end;
  
TANG1981 2005-09-08
  • 打赏
  • 举报
回复
增加是要增加的,但是增加的内存比一个Data占用的内存大好几倍
hunterht 2005-09-08
  • 打赏
  • 举报
回复
每次OnTimer你都FList.Add(Data);一次,内存怎么可能不增加?不明白你要干什么
TANG1981 2005-09-08
  • 打赏
  • 举报
回复
怎样才能确保把申请的255个sDataBlock释放掉呢?
TANG1981 2005-09-08
  • 打赏
  • 举报
回复
谢谢楼上的各位:
采集串口发过来的数据,要缓存起来的,释放是在程序结束的时候释放,应用是没问题。

现在我查明是在释放 FreeMem(Args.pDataBlock);的时候没有把申请的255个SDataBlock释放干静。

可当我新建一个程序,同样的代码,释放是没有问题的。不知道哪位遇到过这样的问题啊?
  • 打赏
  • 举报
回复
FList.Add(Data);
只是添加了一个指向数据的指针而已。
FreeMem(Args.pDataBlock);
仅仅释放了存放指针的数据空间,指针指向的数据并没有释放。
g961681 2005-09-08
  • 打赏
  • 举报
回复
你用Timer不停的创建,也没见你释放啊!
当然不行了!
leonkim 2005-09-08
  • 打赏
  • 举报
回复
在Timer事件中加入
Data := TData.Create;
FList.Add(Data);
这绝对是不可取的,因为你必须要手工去释放Flist中的所有对象。
随着时间的推移,内存中的对象越来越多

不明白楼主为什么要这么做?应该会有更好的方法。
下班了,公司断网了,明天再关注。
QQ:56096682
Larry1030 2005-09-08
  • 打赏
  • 举报
回复
你是运用我觉得好惊讶的, 什么需求一定要求把内存分配动作放在在TTimer 的OnTimer事件中 !
这样可能系统还未释放就已经退出了这个事件
 你这里的flist是什么类?
 如果是TObjectList的对象,也许可以不释放保存的对象,其余的是需要手动释放的
TANG1981 2005-09-08
  • 打赏
  • 举报
回复
老大们都来看看啊,分不够可以在加
TANG1981 2005-09-08
  • 打赏
  • 举报
回复
这样的话Data会被释放掉。

我另写一个事件
Timer.Interval := 50;
在TTimer 的OnTimer事件中
begin
Data := TData.Create;
FList.Add(Data);
end;
按理说这样的写法和我上面所说的所消耗的内存是一样的,但是,上面那种,要比现在的写法多好几多倍。
涩色滴人 2005-09-08
  • 打赏
  • 举报
回复
Data := TData.Create;
FList.Add(Data);
Data.Free;

或者可以用FreeAndNil(Data);
TANG1981 2005-09-08
  • 打赏
  • 举报
回复
FreeMem那句写错了,应该是
FreeMem(Args.pDataBlock);

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧