有关资源释放的问题,自己不太明白的一个现象 ( 积分: 50 )

  • 主题发起人 主题发起人 waveboy
  • 开始时间 开始时间
W

waveboy

Unregistered / Unconfirmed
GUEST, unregistred user!
关键词: 动态创建/frame/Form/free
form和frame都是动态创建.在form上我放置了一个panel,动态创建frame后讲它的parent设置为panel.
frame上我使用了comboBox,comboBox中存放了一系列自定义的对象。
这个程序包括两个form一个frame。
在主窗体中动态创建 frame,form。不过我在创建frame的时候,做了一个判断
if assigned(frame) then 如果frame已经创建则释放掉该frame和combobox里的对象。

窗体在关闭后释放掉,不过没有对frame做处理,对frame的处理在上边已经说了。

窗体和frame第一次创建运行没有问题,可是关闭释放后form再次创建frame产生了错误。因为使用assigned判断frame不是nil,可是我想释放掉frame中combobox的自定义对象,则产生了错误,而且在frame调用free的时候也产生错误。
可是命名存在对象为什么不能使用free呢?

还有一点,程序在释放掉form的时候,对frame有什么影响,毕竟创建的frame是form的一部分。
赐教
 
看不到你的frame是怎么create的,如果owner是form,那么铁定被自动free了
建议你释放窗体或frame时,顺便给变量,比如 frame1 置为nil ,免得你的assigned判断错误。
 
谢谢shangshang

相关代码是这样的:创建frame的代码。
if assigned(fraXPZ) then
begin
//释放资源
freecomboxObject(fraXPZ.cmbxkxm,sizeof(objdata)); // 再次运行到这得时候报错
//运行到函数中: if combo.Items.Count=0 then exit;的时候出现错误
//可以想象到这时候combobox控件应该已经销毁了可是使用assigned判断不是Nil呢?
freecomboxObject(fraXPZ.cmbssqy,sizeof(objdata));
fraXPZ.free;//再次运行到这得时候报错
end;
fraXPZ:=TffraXPZ.Create(application);
fraXPZ.InitggcsData;
fraXPZ.Parent:=frmModel.pnl;
 
控件free时,并不会自动的把变量名置为nil. 要手工去置, 以方便assigned判断。否则就是指向了无效内存。
 
能不能描述一下 delphi释放资源的一个过程
comboBox自定义对象 ---- frame ----form
 
听课,我对这个问题也有疑惑点
 
后退
顶部