record 类型指针变量内存释放问题。

divers 2003-10-17 08:55:17
定义一个结构
type
pSendMsg =^TSendMsg;
TSendMsg= packed record
Source:String;
Dest:String;
Content:String;
end;
var
为了测试内存得释放情况。设置了一下下面得程序
在一个Timer 得ontimer事件中,申请内存,释放内容。
procedure TForm1.Timer1Timer(Sender: TObject);
var
sdMsg :pSendMsg;
br:Boolean;
begin
new(sdMsg) ;
sdMsg^.Source:='Source';
sdMsg^.Dest :='Dest';
sdMsg^.Content:='Hello World';
dispose(sdMsg);
//sdMsg := Nil;
end;
结果发现随着程序得运行,这个程序使用得内存越来越大!
这是为什么,难道是没有释放内存么?
但是dispose不是已经把内存释放了么!

...全文
235 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hiflower 2003-10-22
  • 打赏
  • 举报
回复
procedure TForm1.Timer1Timer(Sender: TObject);
var
sdMsg :pSendMsg;
br:Boolean;
begin
// while true do
begin
new(sdMsg) ;
sdMsg^.Source:='Source';
sdMsg^.Dest :='Dest';
sdMsg^.Content:='Hello World';
dispose(sdMsg);
//sdMsg £º= Nil£»
end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.enabled:=true;
end;


Win2000+D6,没有任何问题
divers 2003-10-22
  • 打赏
  • 举报
回复
我测试过了。我在timer.ontimer 事件里面,什么东西都不写,结果内存还是一直在增加。我想这个内存的增加应该跟我的new和dipose关系不大,而可能跟timer的ontimer有点关系吧。能帮我分析分析这是为什么?
divers 2003-10-22
  • 打赏
  • 举报
回复
To: hiflower(花),如果按你这样写的画,虽然内存好像没有增加(我不敢在看),因为我的cpu被占用了97%,我的问题是在timer里面的,你在那里面调试看看。应该是会增加的。
hiflower 2003-10-21
  • 打赏
  • 举报
回复
这样试验,未发现内存的变化。
procedure TForm1.Button1Click(Sender: TObject);
var
sdMsg :pSendMsg;
br:Boolean;
begin
while true do
begin
new(sdMsg) ;
sdMsg^.Source:='Source';
sdMsg^.Dest :='Dest';
sdMsg^.Content:='Hello World';
dispose(sdMsg);
//sdMsg £º= Nil£»
end;
end;
song0311 2003-10-21
  • 打赏
  • 举报
回复
type
pSendMsg =^TSendMsg;
TSendMsg= packed record
Source:String;
Dest:String;
Content:String;
end;

上面的代码是不是定义了一个指向记录类型(tsendmsg)的指针类型变量?
在定义记录类型时用到 PACKED是什么用处啊?
divers 2003-10-21
  • 打赏
  • 举报
回复
那么我要怎么来把这快内存释放呢》
divers 2003-10-20
  • 打赏
  • 举报
回复
怎么可能,我运行了好多次都会的,你把这个拷过去运行的?你把Timer1.interval := 10 k看看,肯定会一直增加的。
wanwangzhiwang 2003-10-20
  • 打赏
  • 举报
回复
不会吧?我试了一下,没有增加
linkyou 2003-10-20
  • 打赏
  • 举报
回复
up
Linux2001 2003-10-20
  • 打赏
  • 举报
回复
你调节到10根本没有用,系统仍然是54.9毫秒左右触发一次,
New后用Dispose释放,Delphi只是把用new申请的内存标记为丢弃,并没有释放,如果有别的程序申请内存,那么有可能就会分配这部分内存出去!在没有其他程序申请内存的时候,增加也不是不可能的!
divers 2003-10-20
  • 打赏
  • 举报
回复
我在任务管理器里面的进程管理,观察那个进程中的内存使用,结果发现一直增加呀。4k、4k的增加呀。把那个timer1.inertval =10,把他设置为小一点,试试看,应该会增加的。
flyinwuhan 2003-10-20
  • 打赏
  • 举报
回复
我用MemProof监视程序运行,也没见一直增加。
snowfog 2003-10-17
  • 打赏
  • 举报
回复
应该没问题,你试试把packed去掉。

5,386

社区成员

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

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