内存泄漏之二,什么情况下会申请内存,一般有哪几个常用操作会申请内存。

解决方案 »

  1.   

    申请内在一般多用于指针或对内存块的操作
    New //多用于申请类似于记录类型的内存块
    GetMem;//常用的内存申请方式
    AllocMemFreeMem,Dispose;释放内存其中New 对应的释放语句为DisposeGetMem,AllocMem对应的释放语句为FreeMem
    Getmem与AllocMem区别不大,AllocMem是同时将申请的内存清0一般把内存释放语句用于以下结构,避免内存泄露
    try
    finally
    //释放内存
    end;
      

  2.   

    额这个 问题,
    变量,对象都要分配内存的啊?
    在面向对象编程里对象一定要释放。养成良好的变成习惯
    创建对象:create
    释放对象 :free free是一个方法,里面还有dispose函数 里面大概是这样的,如果对象不为空,执行dispose;
      

  3.   

    这个问题准备连问5天
    看下面这个程序,
    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
        end;
        StringList.Free;
    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
      

  4.   

    上面错了 应该是
        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
        end;
    //    StringList.Free;{和楼上区别:这一行必须注释掉,有它运行不了。}
    end;