接口对象得释放,对象已经释放,但是内存没释放,请问是什么问题

scor 2008-07-29 07:27:59
这2种方法都没释放掉内存

//方法一 , 释放掉对象
procedure TForm1.Button2Click(Sender: TObject);
Var
Line: ILine;
List: TInterfaceList;
I: Integer;
begin
List:= TInterfaceList.Create;
For I:=0 To 55555 Do Begin
Line:= TLine.Create;;
List.add(Line);
End;
List.clear;
List.Free;
end;


//方法一 , 释放掉对象
procedure TForm1.Button2Click(Sender: TObject);
Var
Line: ILine;
a: TLine;
List: TInterfaceList;
I: Integer;
begin
List:= TInterfaceList.Create;
For I:=0 To 55555 Do Begin
a:= TLine.Create;
Line:= a;
List.add(Line);
a.Free;
End;
List.clear;
List.Free;
end;

进程管理器现实PROJECT1 占用内存很大。并没释放出来。请问怎么解决?谢谢
...全文
297 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsj070599 2008-08-01
  • 打赏
  • 举报
回复
加上

Line := nil; //使用接口不要时要设为nil.
yuehaiyang 2008-07-30
  • 打赏
  • 举报
回复
//方法一 , 释放掉对象
procedure TForm1.Button2Click(Sender: TObject);
Var
Line: ILine;
List: TInterfaceList;
I: Integer;
begin
List:= TInterfaceList.Create;
For I:=0 To 55555 Do Begin
Line:= TLine.Create; //手动创建
List.add(Line);
End;
//要手动释放
For I:=0 To 55555 Do Begin
Line:= ILine(list.item[i]).free;
End;

List.clear;
List.Freeandnil();
end;
genispan 2008-07-30
  • 打赏
  • 举报
回复
不错 有点意思
金卯刀 2008-07-30
  • 打赏
  • 举报
回复
請看紅字部分解釋
//方法一 , 释放掉对象
procedure TForm1.Button2Click(Sender: TObject);
Var
Line: ILine;
List: TInterfaceList;
I: Integer;
begin
List:= TInterfaceList.Create;
For I:=0 To 55555 Do Begin
Line:= TLine.Create;; //引用計數加1
List.add(Line); //引用計數加1,此時引用計數為2
End;
List.clear; //將list的count清0,同時釋放分配的保存對象指針的空間,不影響引用計數
List.Free; //一個普通方法而已,釋放自己(比如成員變量的空間)的空間,不影響引用計數
end;


//方法一 , 释放掉对象
procedure TForm1.Button2Click(Sender: TObject);
Var
Line: ILine;
a: TLine;
List: TInterfaceList;
I: Integer;
begin
List:= TInterfaceList.Create;
For I:=0 To 55555 Do Begin
a:= TLine.Create; 引用計數+1
Line:= a; 引用計數+1
List.add(Line); 引用計數+1,此時引用計數為3
a.Free; 引用計數-1,此時引用計數為2
End;
List.clear; 道理同上一個方法
List.Free;
end;

綜上分析,由於接口的引用計數不為0,因而,在代碼中,雖然有調用free,但實際並未釋放。只有當引用計數為0時,接口會自動釋放
lsj070599 2008-07-30
  • 打赏
  • 举报
回复
TInterfaceList 是什么东西,看下他释放都做了什么..
etomahawk 2008-07-30
  • 打赏
  • 举报
回复
是不是局部变量都是随着procedure或function结束而自动释放的,

-----------------------------------------------

简单的变量,比如Integer, char等,都会自动释放掉,因为它们位于栈上。但是,对于创建的对象,比如TButton,是不会自动释放的。因为他们是在堆上被创建的(Delphi的对象基本上都是在堆上的,当然,你也可以创建栈上的对象,不过,栈上的对象更像是一个结构体)。


List.Free; 不会释放第二个对象。

------------------------------------------------

你可以把TList想象成一个链表,它只是存储了一个指针,这个指针指向了你所创建的对象。当你释放链表节点的时候,存储在当中对象是不会被释放的。
scor 2008-07-30
  • 打赏
  • 举报
回复
mygodsos
对于对象而言 压入Tlist中后 TList释放得时候只清空Tlist中得指针
并不会释放TList中得对象
scor 2008-07-30
  • 打赏
  • 举报
回复
补充,ILine得支持对象TLine 是从 TInterfaceObject继承下来
没有屏蔽接口引用计数得
谢谢
mygodsos 2008-07-30
  • 打赏
  • 举报
回复
我也是一直想知道有些对象压入list后,到底释放了没有,比如

type
TMyClass=class
Name:string;
end;

procedure test;
var
MyClass:TMyClass;
List:TList;
begin
List:=TList.Create;
MyClass:=TMyClass.Create;
MyClass.Name:='111';
List.Add(MyClass);
MyClass:=TMyClass.Create;
MyClass.Name:='222';
List.Add(MyClass);
MyClass.Free; //这里只释放了一个myclass
List.Free; //----这里会不会释放另一个myclass
end;

还有,是不是局部变量都是随着procedure或function结束而自动释放的,
没人回答我就另开一贴来提问
smallcrocodile 2008-07-29
  • 打赏
  • 举报
回复
不明白
xylegend 2008-07-29
  • 打赏
  • 举报
回复
没结束之前怎么可能释放

5,388

社区成员

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

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