如何安全且完整地释放Dll

Frank6600 2013-11-27 08:00:51
主程序动态地Load几个我自己写的Dll,
并实例化当中一个继承自 TPage 的类,比如 TMyPage = class(TPage),
其中 TMyPage 又 Create N 个对象。
最后Free TMyPage 的实例。
但TMyPage下的N个对象我没把握一定会全释放(有时会忘记,你知道的)

那,我要如何安全又完整地释放上述动态Load的DLL呢?
我看到VB下有提供了一个类似SafeXXXX的方法可以安全(即不出错)释放DLL,
我们Delphi下有什么技巧可以既安全
又完整地(即任何跟随TMyPage建立的对象都Free掉)释放Dll呢?

我设计的框架会很频繁地(几分钟到几十分钟一次吧)Load和释放Dll,
有什么相关的技巧是我要知道并注意的呢?
...全文
295 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Frank6600 2013-11-28
  • 打赏
  • 举报
回复
> 通常的跟ui相关的都不提倡放dll中,dll中应该只封装业务逻辑,你在设计处就应该考虑到。 好的。目前我的DLL里都没有UI相关的。 > 那些你说的无法把握的对象的free又是咋回事,如果曾经出现过这种情况,应该打破砂锅弄清楚原因 嗯,目前在搭框架阶段,DLL都是自己写。将来Open给大家使用,写DLL的人任何人都有可能, 虽然能够尽量要求他们在Create时传入Owner来自动Free, 但我猜有时未必能够绝对做到。 > 另个你load\free几分钟到几十分钟一次也不算频繁吧,反而应该说是很少才对。。。 哦,原来几分钟到几十分钟一次还不算频繁,那就好。 事实上,几分钟到几十分钟Load/Unload一次是Debug阶段才会有的频率, 上线后就基本不Unload了。
Frank6600 2013-11-28
  • 打赏
  • 举报
回复
> 和界面相关的建议放入BPL,不然内存操作蛋疼的很 好的,谢谢建议。目前DLL里都没有界面相关的。
hsfzxjy 2013-11-27
  • 打赏
  • 举报
回复
和界面相关的建议放入BPL,不然内存操作蛋疼的很
sololie 2013-11-27
  • 打赏
  • 举报
回复
通常的跟ui相关的都不提倡放dll中,dll中应该只封装业务逻辑,你在设计处就应该考虑到。 那些你说的无法把握的对象的free又是咋回事,如果曾经出现过这种情况,应该打破砂锅弄清楚原因 另个你load\free几分钟到几十分钟一次也不算频繁吧,反而应该说是很少才对。。。
Frank6600 2013-11-27
  • 打赏
  • 举报
回复
1.哈哈,这个方法,我一个月前才在这里教另一个人的; 2.是嵌入框架,一定要动态调用。
sololie 2013-11-27
  • 打赏
  • 举报
回复
obj:=tboject.create(owner); obj创建后,它的释放由owner负责,你无需关系obj什么时候释放,因为owner释放时就会负责它obj释放 再个例子,

var
  form2:tform;
  page1:tmypage;
begin
  form2:=tform.create(form1{self}); // form2对象的释放交由form1自动完成,假设form1是主窗体,那它即self
  page1:=tmypage(form2);// page1对象的释放就由form2负责,不是窗体也可以
                        // 只要它是个TComponet类或其后代类,实际上所有从TPersistent继承的对象
                        // 都由vcl内存实现了该功能,你只要确保最顶端的owner(属主,最外层容器)
                        // 释放了,那么所有属于它的对象都能自动释放
 .......

 // 最后form1销毁时,就会销毁form2,form2销毁时就销毁page1
 // 你只要明确顶层的owner(这里是form1)销毁就行了
 form1.free;
end;
另外dll如果频繁使用,静态调用就得了

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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