在一个函数中用TStrings 创建一个实例,会被释放吗?如何证明.(100分)

X

xiaolv

Unregistered / Unconfirmed
GUEST, unregistred user!
首先,创建一个普通函数.
function mystrings:Tstrings;
begin
result:=tstringlist.create;
result.add('aaa');
result.add('bbb');
end;
然后,在窗体上放一个Memo1,和一个Button1.
在Button1的onClick事件中写入:
memo1.lines.assign(mystrings);
这样,函数mystrings创建的实例会被释放吗?
我们并没有见到result.free这样的语句呀。
如果被释放,该如何证明呢?
 
你自己释放才行:
procedure TForm1.Button2Click(Sender: TObject);
var
temp: TStrings;
begin
temp := MyStrings;
Memo1.Lines.Assign(temp);
temp.Free;
end;
 
独帅您好,谢谢您回答了我的问题。
是不是要这样:
procedure TForm1.Button1Click(Sender: TObject);
begin
memo1.lines.assign(my);
my.Free;
end;
但我该如何写测试代码,才能证明如果不用my.free,就会产生资源泄露呢?
再次感谢您的回答.
 
有专门的内存泄露检测工具
如memproof、memory sleuth等
 
安全的用法是让调用者管理自己的内存,而不是让被调用函数来管理调用者的内存。
procedure MyStrings(S: TStrings);
begin
S.Add('aaa');
S.Add('bbb');
S.Add('ccc');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
MyStrings(ListBox1.Items);
end;
 
在超出作用域时应该可以自动清除(指的是TObject继承来的)。
 
大家好,经过我用memproof试验,证明我所用的方法确实存在内存泄漏,我所写的函数
所用的内存会不断增多。而独帅兄提出的方案经过实验,也是可行的。
但这样还是要写很多代码。(最少多写两行),
而Sachow兄所说的写过程的方法我认为很好,调用者只要用一行代码就行,不用再声明
变量和释放它。
在此谢谢xianjun兄提的好工具。
再次谢谢大家所提供的帮助。给分.
 
顶部