函数返回的是TStringList类型的变量,我这样写的代码:
result:=tstringlist.Create;

result.add('sdafdsf');
函数里面没有机会free.会不会造成内存泄漏?

解决方案 »

  1.   

    有可能会
    不过最好写上
    result.free;这样程序安全
    还有最好用try
    finally
      

  2.   

    使用try ...finally吧,保证安全!
      

  3.   

    try
    finally
      result.free;
    这样不管怎样对象都会被释放掉
      

  4.   

    这个函数的代码如下,请问把free加哪儿?
    var
      temp:string;
      i:integer;
    begin
      result:=tstringlist.Create;
      temp:=source;
      i:=pos(ch,source);
      while i<>0 do
      begin
        result.Add(copy(temp,0,i-1));
        delete(temp,1,i);
        i:=pos(ch,temp);
      end;
      result.Add(temp);
    end;
      

  5.   

    函数的返回值如果是类,是不能Free的。
    应该是这样:
    fucntion CreateList:TStrings;
    begin
      result:=TStringList.Create;
      //你的代码
    end;而在调用的时候:
    var
      slTmp:TStrings;
    begin
      slTmp:=CreateList;
      //你的代码
      slTmp.Free;
    end;也就是说,在函数中显式创建类。在调用过程中不显式创建,但是显试释放。
      

  6.   

    这个函数包括了StringList的好多动作哦。这样设计似乎不大好哦。
    一个函数最好一个功能,如果功能比较大,可以设计成类。
    类中提供创建,增加,等操作的方法。
      

  7.   

    这个函数实现的功能是分离字符串
    SplitString(const source, ch: string): tstringlist;
     exu(大脸猫) 说的好像有道理。不过我也觉得这个函数很危险。另外那位朋友能提供一个比较安全点的字符串分离函数?
      

  8.   

    result:=tstringlist.Create;
    这里的result是一个指向tstringlist内存对象的指针,如果不free肯定有内存泄露用参数方式处理
    procedure test(a:tstringlist)
    var
      temp:string;
      i:integer;
    begin
    应该先判断一下a是否已经分配内存
    a.clear;
      temp:=source;
      i:=pos(ch,source);
      while i<>0 do
      begin
        a.Add(copy(temp,0,i-1));
        delete(temp,1,i);
        i:=pos(ch,temp);
      end;
    end;
      

  9.   

    fucntion CreateList:TStrings;
    begin
      result:=TStringList.Create;
      //你的代码
    end;而在调用的时候也可以:
    with CreateList do
       begin
      try
      //你的代码
      finally
       Free;
       end;
       end;
    end;
      

  10.   

    一个很基本,又常被初学者忽略的规则:
       创建者负责释放。
    以前我也写过类似的代码,但现在我再也不写那样的代码了。为什么不把调用函数及该函数调整一下呢?procedure DoSomething(slList: TStrings);
    begin
      //你的代码
    end;而在调用的时候也可以:
    var
      aList: TStrings;
    begin
    ...
      aList := TStringList.Create;
      try
        DoSomething(aList);
      finally
        aList.Free;
      end;
    ...
    end;
      

  11.   

    谢谢 zhxfzhxf1(zhxfzhxf1) ,我打算用你的办法做。
    procedure DoSomething(s1,s2:string,var slList: TStrings);
    begin
      //我的代码
    end;
    我把那个slList参数前加了个var这样可以传址了,在调用函数处继续使用。这样那个slList函数里面就没有creat,free了。
      

  12.   

    同意linzhengqun(风)观点 调用过后再释放。
      

  13.   

    zhxfzhxf1(zhxfzhxf1) 写的是对的
    如果你在函数中释放是不对的
    你可以先传入一个类
    处理完成后在释放
    不必要用var的
    类的变量就是一个指针了