当前位置:主页>销售管理软件> 列表

请问大家,这个函数会不会引起内存泄漏 找金蝶财务软件

仓库管理软件版1楼: //将字符串分割到stringlist中
function Split(sString, sSplit: String): TStringList;
var
slResult: TStringList;
iStart, iEnd, iLen: Integer;
sSub, sResult: String;
begin
try
slResult := TStringList.Create;
slResult.Clear;
iStart := 1;
iEnd := 1;
iLen := Length(sSplit);
sResult := sString;
while sResult<> '''' do
begin
iEnd := Pos(sSplit, sResult);
if iEnd =0 then
begin
sSub := sResult;
sResult := '''';
end
else begin
sSub := Copy(sResult, iStart, iEnd-iStart);
sResult := Copy(sResult, iEnd+iLen, Length(sResult)-iEnd-iLen+1);
end;

slResult.Add(sSub);
//iStart := Pos(sSplit, sResult);
end;
Result := slResult;
finally
slResult.Free;
end
end;


调用方法
var s1,s2: String
s1 = split(''我爱北京|我爱中国'',''|'').string[0];
s2 = split(''我爱北京|我爱中国'',''|'').string[1];

2楼: 有问题 如金蝶财务软件

3楼: 函数Split有问题吧,在函数结束前保存的结果被释放了:slResult.Free;
可以使用引用保留结果啊

4楼: delphi对象赋值实际为把对象的指针赋过去
即对象引用
你把slResult的引用返回给你的函数,然后却把这个对象释放了
上哪里找你那个对象
可以用对象克隆,或者引用之后释放对象

5楼: 不是内存泄漏,而是返回了一个已经被释放的对象,严重问题!!!
建议把函数修改为
procedure Split(const strings: TStrings; sString, sSplit: String):
begin
if strings = nil then exit;
strings.Clear;
............
end;

6楼: //将字符串分割到stringlist中
procedure Split(sString, sSplit: String; var resSList: TStringList);
var
// Result: TStringList;
iStart, iEnd, iLen: Integer;
sSub, sResult: String;
begin
resSList.Clear;
iStart := 1;
iEnd := 1;
iLen := Length(sSplit);
sResult := sString;
while sResult<> '''' do
begin
iEnd := Pos(sSplit, sResult);
if iEnd =0 then
begin
sSub := sResult;
sResult := '''';
end
else begin
sSub := Copy(sResult, iStart, iEnd-iStart);


sResult := Copy(sResult, iEnd+iLen, Length(sResult)-iEnd-iLen+1);
end;

resSList.Add(sSub);
//iStart := Pos(sSplit, sResult);
end;
end;





procedure TForm1.Button1Click(Sender: TObject);
var s1: TStringList;
begin
s1:= TStringList.Create;
try
split(''我爱北京|我爱中国'',''|'',s1);
Edit1.Text := s1.Strings[0];
Edit2.Text := s1.Strings[1];
finally
s1.Free;
end;
end;

仓库管理软件版7楼: 谢谢各位,结贴

8楼: 同意 嘿嘿

9楼: 多人接受答案了。