在delphi里如何防止内存泄漏? (分不在高) ( 积分: 5 )

  • 主题发起人 主题发起人 zyx0404
  • 开始时间 开始时间
Z

zyx0404

Unregistered / Unconfirmed
GUEST, unregistred user!
用C++比较容易了解内存的使用情况,但是我对delphi还不是特别了解
请问用delphi如何防止内存泄漏?
 
一般申请了内存,在不需要的时候释放掉就可以避免这个问题.另外,兄弟可以用FastMM的内存检测来检测自己的程序是否有内存泄漏的问题.
 
请问在delphi里
什么情况下是delphi自动分配内存,又自动清除内存
什么情况下是手动分配内存,又是需要手动清除内存?
 
一般来说,栈中分配的内存程序自动分配自动回收
堆中分配的内存需要手动分配手动回收
 
楼上正解~
 
1、每个 dpr 第一个 uses FastMM4
2、经常使用 AQtime 进行检测
 
一般字符串,动态数组,Viarint类型和接口都是生存期自管理的.
TComponent组件如果分配的时候指定了Onwer的话,释放Owner的时候也可以自动被释放.
其他要分配和释放.
 
给我说的都挺对的,我也查出了一些内存泄漏的地方
估计还没有完全查出来,仍然有内存泄漏,还不清楚是怎么泄漏的
 
查了很久终于发现内存泄漏的地方了,是interface不能release内存

//////////////这是一些主要代码///////////
//---定义interface---
IEntity = interface(IInterface);

//---interface的实现类---
TEtyImpl = class(TInterfaceObject, IEntity);

//-----列表类-----
TEtyList = class
private
//该成员是TInterfaceList
m_List : TInterfaceList;

public
//增加到列表
function AddEntity(ety : IEntity) : integer;

//清楚列表
procedure Clear;
end;

///----列表类的方法----
function TEtyList.AddEntity(ety :IEntity) :integer;
begin
result := m_List.Add(ety);
end;

procedure TEtyList.Clear;
var
i : integer;
begin
//问题出在这里,m_List.Clear并没有释放内存。后来我加上以下代码也不行
// for i := 0 to m_List.Count - do
// m_List.Item := nil;

m_List.Clear;
end;

////////////////////主程序///////////////
var
ety1, ety2 : IEntity;
list : TEtyList;
begin
ety1 := TEtyImpl.Create;
//问题出在这里,ety1 := nil并没有释放内存
ety1 := nil;

ety2 := TEtyImpl.Create;
list.AddEntity(ety);
//问题出在这里,m_List.Clear并没有释放内存。
list.Clear;
end;

请问对interface应该如何释放内存呢?
 
for i := 0 to m_List.Count - do
IEntity(m_List.Item) := nil;
或者
for i := 0 to m_List.Count - do
IInterface(m_List.Item)._Release;
 
to zqw0117:
IEntity(m_List.Item) := nil;
我也试过这个,不行。
估计IEntity(m_List.Item)._Release也不行

我个人认为是m_List.Item的指针并不知道是TEtyImpl类型的,所以他无法释放内存
如果写出TEtyImpl(m_List.Item) := nil;这也不行,首先类型不对,第二不通用
 
请不要用普通的List保存Interface的指针,请用TInterfaceList来保存,我记的没错的话,这个类应该是Contrns单元声明的(如果记错了,你用Find in file找找)
 
to zqw0117:
我用的是TInterfaceList
private
//该成员是TInterfaceList
m_List : TInterfaceList;
 
问题有两个

ety1 := TEtyImpl.Create;
//问题出在这里,ety1 := nil并没有释放内存
ety1 := nil;

ety2 := TEtyImpl.Create;
list.AddEntity(ety);
//问题出在这里,m_List.Clear并没有释放内存。
list.Clear;
 
ety1 := TEtyImpl.Create as IEntity;
//.....
ety1 := nil;
这样呢?
 
楼主既然TInterfaceObject还不如
自己直接写接口集成IInterface的QueryInterface _AddRef _Release方法再试试
 

Similar threads

回复
0
查看
992
不得闲
D
回复
0
查看
926
DelphiTeacher的专栏
D
D
回复
0
查看
880
DelphiTeacher的专栏
D
后退
顶部