这个问题准备连问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
上面错了 应该是 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;
New //多用于申请类似于记录类型的内存块
GetMem;//常用的内存申请方式
AllocMemFreeMem,Dispose;释放内存其中New 对应的释放语句为DisposeGetMem,AllocMem对应的释放语句为FreeMem
Getmem与AllocMem区别不大,AllocMem是同时将申请的内存清0一般把内存释放语句用于以下结构,避免内存泄露
try
finally
//释放内存
end;
变量,对象都要分配内存的啊?
在面向对象编程里对象一定要释放。养成良好的变成习惯
创建对象:create
释放对象 :free free是一个方法,里面还有dispose函数 里面大概是这样的,如果对象不为空,执行dispose;
看下面这个程序,
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
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;