高手过来看一段程序,会不会出现内存泄露(35分)

  • 主题发起人 主题发起人 theone_jxm
  • 开始时间 开始时间
T

theone_jxm

Unregistered / Unconfirmed
GUEST, unregistred user!
function test:tstrings;
var
strlist:tstrings;
begin
strlist:=tstringlist.Create;
strlist.Add('11');
strlist.Add('22');
result:=strlist;
//strlist.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
listbox1.Items.AddStrings(test);
end;

问题是我在test函数中建立了一个tstringlist对象没有释放,请问回不回有内存泄露?
 
不会泄漏的。这里的内存指针实事就是listbox1.Items,在tstringlist.Create只不过是
建立一个指向listbox1.Items的指针。
你可以用下面的代码测试多次tstringlist.Create,其内存也不会泄漏的。
var
strlist:tstrings;
i:integer;
begin
for i:=0 to 9999 do
begin
strlist:=tstringlist.Create;
strlist.Add(IntToStr(i));
listbox1.Items.AddStrings(strlist);
end;
end;
 
好的。谢谢zhanggm。
大家还有什么别的看法啊?
我想学习学习啊。
 
会的,你可以看一下AddStrings的代码,就知道了
procedure TStrings.AddStrings(Strings: TStrings);
var
I: Integer;
begin
BeginUpdate;
try
for I := 0 to Strings.Count - 1 do
AddObject(Strings, Strings.Objects);
finally
EndUpdate;
end;
end;

呵呵,这里不是指针指向的问题,而是直接插入新的
 
这是一个内存分配与管理的问题。
正常情况下应该调用 Free,现在的问题是根本不能调用 Freee,一Free
什么都没有了。说明 Result引用 strlist,而且函数执行完成时根据没有
释放strlist。所以这里就要看调用函数是不是负责释放。

以下的写法会不会改观,我也不清楚,因为也存在 create 和 free 不对应的情况。
function test:tstrings;
begin
result:=tstringlist.Create;
result.Add('11');
result.Add('22');
end;

总之,如果不放心的话,可以考虑用变参;
或将 strlist:tstrings;声明为全局变量,程序启动时建立,终止时释放。
需要的时候直接用,不用再 create,这样就不存在不对应的问题。
当然用前要 clear 一下。
 
我认为会的,因为strlist不会自动释放,你可以用MEMPROOF检测一下.
 
谢谢大家。zhtx你知道MEMPROOF怎么用了?那里得来的呢?
 
多人接受答案了。
 
后退
顶部