确认一下简单的内存泄露问题。~~~~

michaelpeng7799 2003-10-17 11:30:42
心里还是有点疑虑,还是来这里确定一下意见 ^_^

(FSerialList 是全局的TStringList实例 )

procedure TForm1.Button1Click(Sender: TObject);
begin
FStringList:=TStringList.Create; //after click lost memory
for j:=0 to 10000 do
FStringList.Add(DateTimeToStr(now));
end;

每次点击(除了第一回),FStringList原来指向的堆里的数据都会无法再被管理,FStringList又被重定到新开辟的内存了。
是这样的么?^_^
...全文
39 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
michaelpeng7799 2003-10-21
  • 打赏
  • 举报
回复
再up一下,然后就结贴了。
huojiehai 2003-10-18
  • 打赏
  • 举报
回复
对,会,应这样改一下
....
private
FStringList: TStringlist;
....

procedure TForm1.Button1Click(Sender: TObject);
var
j: integer;
begin
if Assigned(FStringList) then
FStringList.free;
FStringList:=TStringList.Create; //after click lost memory
for j:=0 to 10000 do
FStringList.Add(DateTimeToStr(now));
end;

在FormDestroy中还要
if Assigned(FStringList) then
FStringList.free;
gold_future 2003-10-18
  • 打赏
  • 举报
回复
free 在调用时先判断一个指针是否为空如果为空则什么也不做退出。这样很安全。
如果指针不为空则调用对象的析构函数。

看这样代码
var
aButton:TButton;
begin
aButton:=Tbutton(Form1);
//do something;
end;
这样相当于给aButton 指定一个宿主(form1),form1 对象有一个列表 其中存放用aButton 对象的指针,相当于此时有两个指针指向同一个内存单元,一个指针存放在form1中,一个存放在变量aButton 中这样 在form1 释放时如果发现 abutton还没释放则form1对象负责释放。

//你会有这样一个疑部,两个指针同时指向一个内存,如其中一个指针释放了内存而另一个指针不知道,另一个指针再次释放时不是发生错误?
其时不会的, 当你调用aButton.Free 时, aButton.析构函数会通知他的宿来同步的。
即宿主会把列表中的 abutton 指针删除掉(但没有掉用析构函数);

如果你这样
aButton:=Tbutton.Create(nil);
这样你必须调用aButton.Free 否则出现内存问题。
michaelpeng7799 2003-10-18
  • 打赏
  • 举报
回复
为什么要Assigned(FStringList)
直接.free有坏处么,我试了一下FStringList=nil时用free也不会有问题,在free里已有对nil的判断了。

另外如果我最后把程序都关了,那所有的像FStringList这样对象变量所指向的类点的数据如果不free,是不是仍然在内存中??


to huojiehai(海天子)
FormDestroy中还要
if Assigned(FStringList) then
FStringList.free;
那就是说,引用类型的变量数据就算所在form关了那也不会free了??

那VCL中很多类的属性本身也是类类型,那是不是VCL在那些类属性用完之后也要free了,我们如果自已写程序,在类中用了类类型的属性是不是还要手工写程序free他们,而不是这当类的对象变量.free了,那这个类中的各类属性占内存的也自动free了???

一下子引出一些还不太确定的问题,麻烦再帮着给确认一下,多谢!
pankun 2003-10-17
  • 打赏
  • 举报
回复
是这样..你可以在窗体建立时FStringList:=TStringList.Create

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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