这个函数的代码如下,请问把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;
函数的返回值如果是类,是不能Free的。 应该是这样: fucntion CreateList:TStrings; begin result:=TStringList.Create; //你的代码 end;而在调用的时候: var slTmp:TStrings; begin slTmp:=CreateList; //你的代码 slTmp.Free; end;也就是说,在函数中显式创建类。在调用过程中不显式创建,但是显试释放。
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;
fucntion CreateList:TStrings; begin result:=TStringList.Create; //你的代码 end;而在调用的时候也可以: with CreateList do begin try //你的代码 finally Free; end; end; end;
一个很基本,又常被初学者忽略的规则: 创建者负责释放。 以前我也写过类似的代码,但现在我再也不写那样的代码了。为什么不把调用函数及该函数调整一下呢?procedure DoSomething(slList: TStrings); begin //你的代码 end;而在调用的时候也可以: var aList: TStrings; begin ... aList := TStringList.Create; try DoSomething(aList); finally aList.Free; end; ... end;
不过最好写上
result.free;这样程序安全
还有最好用try
finally
finally
result.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;
应该是这样:
fucntion CreateList:TStrings;
begin
result:=TStringList.Create;
//你的代码
end;而在调用的时候:
var
slTmp:TStrings;
begin
slTmp:=CreateList;
//你的代码
slTmp.Free;
end;也就是说,在函数中显式创建类。在调用过程中不显式创建,但是显试释放。
一个函数最好一个功能,如果功能比较大,可以设计成类。
类中提供创建,增加,等操作的方法。
SplitString(const source, ch: string): tstringlist;
exu(大脸猫) 说的好像有道理。不过我也觉得这个函数很危险。另外那位朋友能提供一个比较安全点的字符串分离函数?
这里的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;
begin
result:=TStringList.Create;
//你的代码
end;而在调用的时候也可以:
with CreateList do
begin
try
//你的代码
finally
Free;
end;
end;
end;
创建者负责释放。
以前我也写过类似的代码,但现在我再也不写那样的代码了。为什么不把调用函数及该函数调整一下呢?procedure DoSomething(slList: TStrings);
begin
//你的代码
end;而在调用的时候也可以:
var
aList: TStrings;
begin
...
aList := TStringList.Create;
try
DoSomething(aList);
finally
aList.Free;
end;
...
end;
procedure DoSomething(s1,s2:string,var slList: TStrings);
begin
//我的代码
end;
我把那个slList参数前加了个var这样可以传址了,在调用函数处继续使用。这样那个slList函数里面就没有creat,free了。
如果你在函数中释放是不对的
你可以先传入一个类
处理完成后在释放
不必要用var的
类的变量就是一个指针了