提供一个对象作为函数结果是不是内存安全? [英] Is it memory safe to provide an object as a function result?

查看:126
本文介绍了提供一个对象作为函数结果是不是内存安全?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这里我提供了简单的代码片段。

  function GetStringList:TStringList; 
var i:integer;
begin
结果:= TStringList.Create;
Result.Add('Adam');
Result.Add('Eva');
Result.Add('Kain');
Result.Add('Abel');
结束


程序ProvideStringList(SL:TStringList);
var i:integer;
名称:TStringList;
begin
名称:= TStringList.Create;
Names.Add('Adam');
Names.Add('Eva');
Names.Add('Kain');
Names.Add('Abel');
SL.Assign(Names);
Names.Free;
结束


程序TForm1.btn1Click(发件人:TObject);
var SL:TStringList;
i:integer;
begin
SL:= TStringList.Create;
SL.Assign(GetStringList);
for i:= 0 to 3 do ShowMessage(SL [i]);
SL.Free;
结束


程序TForm1.btn2Click(发件人:TObject);
var SL:TStringList;
i:integer;
begin
SL:= TStringList.Create;
ProvideStringList(SL);
for i:= 0 to 3 do ShowMessage(SL [i]);
SL.Free;
结束

现在的问题:函数GetStringList中的结果对象会发生什么:Tstringlist,但从来没有释放过(我调用2次创建,只有1次免费)
它是内存安全的通过功能提供对象,还是应该使用过程来完成这个任务,其中对象创建和销毁被简单地处理(过程ProvideStringlist)?我打2次创建和2次免费。
还是有其他解决方案?



提前Thanx



Lyborko

解决方案

我不知道你的意思是安全的,但这是常见的做法。该函数的调用者负责释放返回的对象:

  var 
s:TStringList;
begin
s:= GetStringList;
// stuff
s.free;
结束


Here I provide simple piece of code.

function GetStringList:TStringList;
var i:integer;
begin
   Result:=TStringList.Create;
   Result.Add('Adam');
   Result.Add('Eva');
   Result.Add('Kain');
   Result.Add('Abel');
end;


procedure ProvideStringList(SL:TStringList);
var i:integer;
    Names:TStringList;
begin
   Names:=TStringList.Create;
   Names.Add('Adam');
   Names.Add('Eva');
   Names.Add('Kain');
   Names.Add('Abel');
   SL.Assign(Names);
   Names.Free;
end;


procedure TForm1.btn1Click(Sender: TObject);
var SL:TStringList;
    i:integer;
begin
   SL:=TStringList.Create;
   SL.Assign(GetStringList);
   for i:=0 to 3 do ShowMessage(SL[i]);
   SL.Free;
end;


procedure TForm1.btn2Click(Sender: TObject);
var SL:TStringList;
    i:integer;
begin
   SL:=TStringList.Create;
   ProvideStringList(SL);
   for i:=0 to 3 do ShowMessage(SL[i]);
   SL.Free;
end;

And now the question: what will happen to result object in function GetStringList:Tstringlist, which is created, but never freed? (I call 2 times Create and only 1 time Free) Is it memory safe to provide objects by function or should I use procedures to do this task, where object creation and destroying is simply handled (procedure ProvideStringlist)? I call 2 times Create and 2 times Free. Or is there another solution?

Thanx in advance

Lyborko

解决方案

I don't know what you mean by safe, but it is common practice. The caller of the function becomes responsible for freeing the returned object:

var
   s : TStringList; 
begin
   s := GetStringList;
   // stuff
   s.free;
end;

这篇关于提供一个对象作为函数结果是不是内存安全?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆