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

wugangcn 2008-11-03 06:08:22
内存泄漏之二,什么情况下会申请内存,一般有哪几个常用操作会申请内存。
...全文
130 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
DreamMan81 2008-11-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 madyak 的回复:]
申请内在一般多用于指针或对内存块的操作
New //多用于申请类似于记录类型的内存块
GetMem;//常用的内存申请方式
AllocMem

FreeMem,Dispose;释放内存

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

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

一般把内存释放语句用于以下结构,避免内存泄露
try
finally
//释放内存
end;
[/Quote]已经详细了
wugangcn 2008-11-03
  • 打赏
  • 举报
回复
上面错了 应该是
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;
wugangcn 2008-11-03
  • 打赏
  • 举报
回复
这个问题准备连问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
huanghua 2008-11-03
  • 打赏
  • 举报
回复
额这个 问题,
变量,对象都要分配内存的啊?
在面向对象编程里对象一定要释放。养成良好的变成习惯
创建对象:create
释放对象 :free free是一个方法,里面还有dispose函数 里面大概是这样的,如果对象不为空,执行dispose;
五维思考 2008-11-03
  • 打赏
  • 举报
回复
脑袋怎么少一块呢?
HapBegin 2008-11-03
  • 打赏
  • 举报
回复
同意楼上
madyak 2008-11-03
  • 打赏
  • 举报
回复
申请内在一般多用于指针或对内存块的操作
New //多用于申请类似于记录类型的内存块
GetMem;//常用的内存申请方式
AllocMem

FreeMem,Dispose;释放内存

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

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

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

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧