关于内存释放的问题(50分)

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

zlj555

Unregistered / Unconfirmed
GUEST, unregistred user!
pMyClass = ^TMyclass;
TMyClass = class
public
name : string;
caption : string;
end;
//TMyList : TList;

//向TMyList中加入值。
procedure TForm1.Button2Click(Sender: TObject);
var
l_pMyClass : pMyClass;
begin
new(l_pMyClass);
if MyList=NIL then MyList := TList.Create;
l_pMyClass^ := TMyClass.Create;
l_pMyClass^.name := 'zlj';
l_pMyclass^.caption :='Caption'+IntToStr(MyList.count);
MyList.Add(l_pMyClass);
end;

//释放的过程。有什么不对请指正???????????谢谢

//这句是不是把占用的内存地址清空??不对的话,该怎么写
1 for i := 0 to MyList.Count -1 do TMyClass(MyList.items^).Free;

2 for i := 0 to MyList.Count -1 do dispose(pMyClass(MyList.items));
1 和 2 有什么区别???

这里数量和执行上一语句前的数量一样
ShowMessage(IntToStr(MyList.count));
MyList.Clear; //请问 MyList := NIL;是不是不用clear;
ShowMessage(IntToStr(MyList.count));数量为0
MyList := NIL;
 
?怎么这样用对象?
procedure TForm1.Button2Click(Sender: TObject);
var
l_MyClass : MyClass;
begin
if assigned(MyList) then MyList := TList.Create;
l_MyClass := TMyClass.Create;
l_MyClass name := 'zlj';
l_MyClass caption :='Caption'+IntToStr(MyList.count);
///l_MyClass 本身就是一个pointer
//假如TMyclass是个record则需要用new来分配地址空间,用dispose来释放空间,假如是class,则用create来生成,用free来释放
MyList.Add(l_MyClass);
end;

释放我通常这样写

for i := 0 to MyList.Count -1 do TObject(MyList.items).Free;
MyList.free;

 
1.释放掉list里面的每一个class
2.释放掉list的每一个元素,即指针,也即那些指向原来class的指针

MyList := NIL; 最好用 MyList.free 代替
 
to zj1978 :你的方法我试过,不行,每次Create将把上次的值覆盖掉,也许Create是在
同一内存地址空间进行的。但是假如我用New的话,将保证不同的地址空间。
 
我不知道你是什么意思
什么叫每次Create将把上次的值覆盖掉?
 
我实际上实现的是把N个此类实例的Pointer列表保存到TList中,就是说以后还要用到创建
过的类。
 
创建过的类?是对象吧

我写的代码没错的

所有生成的对象都会保存在MyList中,你要用就这样
var
l_MyClass : TMyClass;
////
l_MyClass :=TObject(MyList.items)



 
接受答案了.
 
后退
顶部