7 个解决方案
#1
申请内在一般多用于指针或对内存块的操作
New //多用于申请类似于记录类型的内存块
GetMem;//常用的内存申请方式
AllocMem
FreeMem,Dispose;释放内存
其中New 对应的释放语句为Dispose
GetMem,AllocMem对应的释放语句为FreeMem
Getmem与AllocMem区别不大,AllocMem是同时将申请的内存清0
一般把内存释放语句用于以下结构,避免内存泄露
try
finally
//释放内存
end;
New //多用于申请类似于记录类型的内存块
GetMem;//常用的内存申请方式
AllocMem
FreeMem,Dispose;释放内存
其中New 对应的释放语句为Dispose
GetMem,AllocMem对应的释放语句为FreeMem
Getmem与AllocMem区别不大,AllocMem是同时将申请的内存清0
一般把内存释放语句用于以下结构,避免内存泄露
try
finally
//释放内存
end;
#2
同意楼上
#3
![内存泄漏之二,什么情况下会申请内存, 内存泄漏之二,什么情况下会申请内存,](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9hSFIwY0RvdkwyRjJZWFJoY2k1d2NtOW1hV3hsTG1OelpHNHVibVYwTHpJdlFTOHdMekpmYldGa2VXRnJMbXB3Wnc9PQ%3D%3D.jpg?w=700)
#4
额这个 问题,
变量,对象都要分配内存的啊?
在面向对象编程里对象一定要释放。养成良好的变成习惯
创建对象:create
释放对象 :free free是一个方法,里面还有dispose函数 里面大概是这样的,如果对象不为空,执行dispose;
变量,对象都要分配内存的啊?
在面向对象编程里对象一定要释放。养成良好的变成习惯
创建对象: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
看下面这个程序,
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;
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
申请内在一般多用于指针或对内存块的操作
New //多用于申请类似于记录类型的内存块
GetMem;//常用的内存申请方式
AllocMem
FreeMem,Dispose;释放内存
其中New 对应的释放语句为Dispose
GetMem,AllocMem对应的释放语句为FreeMem
Getmem与AllocMem区别不大,AllocMem是同时将申请的内存清0
一般把内存释放语句用于以下结构,避免内存泄露
try
finally
//释放内存
end;
New //多用于申请类似于记录类型的内存块
GetMem;//常用的内存申请方式
AllocMem
FreeMem,Dispose;释放内存
其中New 对应的释放语句为Dispose
GetMem,AllocMem对应的释放语句为FreeMem
Getmem与AllocMem区别不大,AllocMem是同时将申请的内存清0
一般把内存释放语句用于以下结构,避免内存泄露
try
finally
//释放内存
end;
#2
同意楼上
#3
![内存泄漏之二,什么情况下会申请内存, 内存泄漏之二,什么情况下会申请内存,](https://image.shishitao.com:8440/aHR0cHM6Ly93d3cuaXRkYWFuLmNvbS9nby9hSFIwY0RvdkwyRjJZWFJoY2k1d2NtOW1hV3hsTG1OelpHNHVibVYwTHpJdlFTOHdMekpmYldGa2VXRnJMbXB3Wnc9PQ%3D%3D.jpg?w=700)
#4
额这个 问题,
变量,对象都要分配内存的啊?
在面向对象编程里对象一定要释放。养成良好的变成习惯
创建对象:create
释放对象 :free free是一个方法,里面还有dispose函数 里面大概是这样的,如果对象不为空,执行dispose;
变量,对象都要分配内存的啊?
在面向对象编程里对象一定要释放。养成良好的变成习惯
创建对象: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
看下面这个程序,
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;
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
已经详细了