内存泄漏之三,看这个问题

wugangcn 2008-11-04 08:34:53
看下面这个程序,
procedure TF7_proverb.FormCreate(Sender: TObject);
var sss:Tstringlist;iii:integer;
begin
sss:=Tstringlist.Create;
try
sss.Assign(SplitString (AdoqueryA['widths'],','));
for iii:=0 to sss.Count-1 do
begin
dbgrid1.columns[iii].Width:=strtoint(sss.Strings[iii]);
end; { }
finally
sss.Free;
end;
end;
function TF7_proverb.SplitString(Source,Deli:string):TStringList;//²ð·Ö×Ö·û´®º¯Êý
var
EndOfCurrentString:byte;
StringList:TStringList;
begin
StringList:=TStringList.Create;
try
while Pos(Deli,Source)>0 do
begin
EndOfCurrentString:=Pos(Deli,Source);
StringList.add(Copy(Source,1,EndOfCurrentString-1)); //Ìí¼ÓÏîÄ¿
Source:=Copy(Source,EndOfCurrentString+length(Deli),length(Source)-EndOfCurrentString); //¼õÈ¥ÒÑÌí¼ÓÏîºÍ·Ö¸ô·û
end;
StringList.Add(source); //Èç¹û²»´æÔÚ·Ö¸ô·ûʱ£¬Ö±½Ó×÷ΪÏîÄ¿Ìí¼Ó
Result:=StringList; //ÉèÖ÷µ»ØÀàÐÍ
finally
// StringList.Free;
end;
end;

运行后提示This application has leaked memory. The small block leaks are (excluding expected leaks registered by pointer):

5 - 12 bytes: String x 4, Unknown x 1
45 - 52 bytes: TStringList x 1
53 - 68 bytes: Unknown x 1
...全文
120 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
wugangcn 2008-11-04
  • 打赏
  • 举报
回复
我不结贴,是为了给之四,之五作广告,明后天接着问。
wugangcn 2008-11-04
  • 打赏
  • 举报
回复
3楼好快,刚才还没有你。
wugangcn 2008-11-04
  • 打赏
  • 举报
回复
OK,不想今天结贴,不过已经满意了,1楼12分,2楼8分。明后天结。
fangsp 2008-11-04
  • 打赏
  • 举报
回复
对于TStringList或者TStrings对象
一般采用这种形式
var
ListName : TStringList;
begin
ListName := TStringList.Create;
try
//代码
Finally
ListName.Free; //释放ListName
ListName := nil ;
End;
end;
jadeluo 2008-11-04
  • 打赏
  • 举报
回复
SplitString函数有内存泄漏,函数内创建的StringList没有释放。
建议TStringList变量的创建和释放放在SplitString函数外面做。


procedure TF7_proverb.SplitString(Source,Deli:string; var AList:TStringList);
var
EndOfCurrentString:byte;
begin
try
while Pos(Deli, Source)>0 do
begin
EndOfCurrentString := Pos(Deli, Source);
AList.add(Copy(Source, 1, EndOfCurrentString - 1));
Source:=Copy(Source, EndOfCurrentString + length(Deli), length(Source) - EndOfCurrentString);
end;
AList.Add(source);
except
end;
end;


调用:

var
AList: TStringList;
begin
AList := TStringList.Create;
try
SplitString('......', '..', AList);
......
finally
AList.Free;
end;
end;
mygodsos 2008-11-04
  • 打赏
  • 举报
回复
你的程序设计有些问题,你直接把TStringList当参数更好

function TF7_proverb.SplitString(Source,Deli:string,StrList:TStringList):boolean;

这样,你的函数里的stringlist就没必要create和free了,

只用在主程序里create和free

我看到前面有个帖子用fastmm4看内存泄露的,
最后所有对象要
xxx.free;
xxx:=nil;
字符串string要
xxx:='';

可能这样更加干净吧。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧