看下面这个程序, 
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

解决方案 »

  1.   

    你的程序设计有些问题,你直接把TStringList当参数更好function TF7_proverb.SplitString(Source,Deli:string,StrList:TStringList):boolean;这样,你的函数里的stringlist就没必要create和free了,只用在主程序里create和free我看到前面有个帖子用fastmm4看内存泄露的,
    最后所有对象要 
    xxx.free;
    xxx:=nil;
    字符串string要
    xxx:='';可能这样更加干净吧。
      

  2.   

    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;
      

  3.   

    对于TStringList或者TStrings对象
    一般采用这种形式
    var 
      ListName : TStringList;
    begin
      ListName := TStringList.Create;
      try
        //代码
      Finally
        ListName.Free;   //释放ListName
        ListName := nil ;
      End;
    end;