某一自定义函数返回值的类型为TStringList;如下:
function FuncName(const VariantName:integer):TStringList;
var
  RValue:TStringList;
begin
  RValue:=Tstringlist.create;
  ...
  Result:=RValue;  //现在不使用这个RValue了,该如何释放掉这个?free肯定错误的!
  //或者是否有一种好的解决办法?
end;

解决方案 »

  1.   

    函数内的变量有没有解决办法?thanks
      

  2.   

    RValue是个局部变量,函数返回时自动出栈,无须释放呀
      

  3.   

    可以定义自己维护的数组,在函数调用时,把指针添入数组,程序结束前释放。还有,就是函数内部不需要再用一个变量,直接操作result即可
      

  4.   

    这样:
    function FMY(SLMY :TstringList):boolean;
      

  5.   

    本来可以使用var参数,但是我想知道返回TStringList的释放方法! badhorse(小虾):
     局部变量如integer变量等是会自动释放,但TStringList就不一样了!
      

  6.   

    cg1120(代码最优化-§为这世界,添些美丽色彩§):
    参数应该使用var的吧,不然还是出事!!
      

  7.   

    同意 cg1120(代码最优化-§为这世界,添些美丽色彩§):to ahpei(独来读网):
       感觉好象不要VAR也可以,应该就是按地址传递参数啊。当然保险起见还是加上
      

  8.   

    to ahpei(独来读网)
    对象=指针
      

  9.   

    RValue是个引用,可以认为是一个指针,它是个32位数,位于栈中,函数返回时会将它弹出栈而自动销毁,但它指向的TStringList仍然在堆中。
    函数返回后,可以利用返回值来访问堆中的TStringList对象,使用完以后再调用Free即可释放堆中的TStringList对象了。
    另外,如果你想在函数体中释放RValue变量所占内存是不可能的,因为你不可能手工释放栈的内存。
      

  10.   

    function FMY(var SLMY :TstringList):boolean;
    我也没试过,你试试:)
      

  11.   

    感觉好象不要VAR也可以,应该就是按地址传递参数啊。当然保险起见还是加上  不可以吧,这怎么会可以呢,不要var就等于是给函数传了个nil参数值
      

  12.   

    badhorse(小虾):使用完以后再调用Free即可释放堆中的TStringList对象了。具体做法是?thanks!!!
      

  13.   

    同意 cg1120(代码最优化-§为这世界,添些美丽色彩§)的, function XXX(lst:TStringList):Boolean;  调用:  lst:=TStringList.Create();
      XXX(lst);
      //do...
      lst.Free();
      

  14.   

    kimryo(一切皆有可能):
     问一下,函数参数是属于局部变量还是全局?
     你也在函数体内Free掉了TStringlist变量。
     这样子我外部怎么使用它?
      

  15.   

    现在总结出最好的做法是使用var XXX:TStringList参数形式。
    在外部调用的时候创建一个TStringList型变量,
    外部调用完后再Free掉那个变量!!
      

  16.   

    var
      listString:TStringList;  list:=FuncName(0);  //使用list  list.Free;
      list:=nil;
      

  17.   

    老兄理解错啦,我的意喜系:
      function XXX(lst:TStringList):Boolean;
      begin
       //add some string to StringList.
      end;  调用时:  lst:=TStringList.Create();//Create先
      XXX(lst);
      //do...
      lst.Free();
      

  18.   

    多余了
    应该用:
    function FuncName(const VariantName:integer):TStringList;
    begin
      result:=Tstringlist.create;
    end;返回的是指针,内存没有问题的
      

  19.   

    同意befree(似有似无)
    delphi中所有class的实例俱为指针,
    无需为此操心。
      

  20.   

    kimryo(一切皆有可能):
    明白了!!呵呵!!befree(似有似无):
    假设我们对Result进行了操作,如Add(String)等,那么就跟内存没有关系?
      

  21.   

    如果你没有用他的返回值,指向的内容delphi会释放
    如果你赋植给另一个变量,占用的内存是你的调用变量
    如:function FuncName:TStringList;
    begin
      result:=Tstringlist.create; //只是一个指针
      result.add('love someone'); //加了
    end;procedure one;
    var needstrings:TStringList;
    begin
    { needstrings:=TStringList.create; //另一个指针 ,多余}
     needstrings:=TStringList;
     showmessage(needstrings[0]);
     needstrings.free;   //释放了
    end;