内存泄漏之二,什么情况下会申请内存,

时间:2022-12-11 20:57:38
内存泄漏之二,什么情况下会申请内存,一般有哪几个常用操作会申请内存。

7 个解决方案

#1


申请内在一般多用于指针或对内存块的操作
New //多用于申请类似于记录类型的内存块
GetMem;//常用的内存申请方式
AllocMem

FreeMem,Dispose;释放内存

其中New 对应的释放语句为Dispose

GetMem,AllocMem对应的释放语句为FreeMem
Getmem与AllocMem区别不大,AllocMem是同时将申请的内存清0

一般把内存释放语句用于以下结构,避免内存泄露
try
finally
//释放内存
end;

#2


同意楼上

#3


内存泄漏之二,什么情况下会申请内存, 脑袋怎么少一块呢?

#4


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

#5


这个问题准备连问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

#6


上面错了 应该是
    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;

#7


引用 1 楼 madyak 的回复:
申请内在一般多用于指针或对内存块的操作 
New //多用于申请类似于记录类型的内存块 
GetMem;//常用的内存申请方式 
AllocMem 

FreeMem,Dispose;释放内存 

其中New 对应的释放语句为Dispose 

GetMem,AllocMem对应的释放语句为FreeMem 
Getmem与AllocMem区别不大,AllocMem是同时将申请的内存清0 

一般把内存释放语句用于以下结构,避免内存泄露 
try 
finally 
//释放内存 
end;
已经详细了

#1


申请内在一般多用于指针或对内存块的操作
New //多用于申请类似于记录类型的内存块
GetMem;//常用的内存申请方式
AllocMem

FreeMem,Dispose;释放内存

其中New 对应的释放语句为Dispose

GetMem,AllocMem对应的释放语句为FreeMem
Getmem与AllocMem区别不大,AllocMem是同时将申请的内存清0

一般把内存释放语句用于以下结构,避免内存泄露
try
finally
//释放内存
end;

#2


同意楼上

#3


内存泄漏之二,什么情况下会申请内存, 脑袋怎么少一块呢?

#4


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

#5


这个问题准备连问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

#6


上面错了 应该是
    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;

#7


引用 1 楼 madyak 的回复:
申请内在一般多用于指针或对内存块的操作 
New //多用于申请类似于记录类型的内存块 
GetMem;//常用的内存申请方式 
AllocMem 

FreeMem,Dispose;释放内存 

其中New 对应的释放语句为Dispose 

GetMem,AllocMem对应的释放语句为FreeMem 
Getmem与AllocMem区别不大,AllocMem是同时将申请的内存清0 

一般把内存释放语句用于以下结构,避免内存泄露 
try 
finally 
//释放内存 
end;
已经详细了