假设在开始时创建具有某些表单且仅一个数据模块的应用程序.
在DM1.OnCreate事件中,创建TStringList以在运行时使用.
我们知道,当应用程序被终止时,所有内容都将被销毁,内存将自动释放.释放一些东西可能需要一些时间,因此并不总是建议担心关机时的内存泄漏.参见例如来自Barry Kelly的 this answer或来自Raymond Chen的 this post.
在DM1.OnCreate事件中,创建TStringList以在运行时使用.
我们知道,当应用程序被终止时,所有内容都将被销毁,内存将自动释放.释放一些东西可能需要一些时间,因此并不总是建议担心关机时的内存泄漏.参见例如来自Barry Kelly的 this answer或来自Raymond Chen的 this post.
除此之外,如果我没有将TStringList.Free添加到DM1.OnDestroy,FastMM会报告内存泄漏.在搜索我真正担心的任何其他内存泄漏时,这会成为一个问题.
所以基本上我问是否/为什么/何时我应该释放将被应用程序或操作系统释放的对象实例(在这种特定情况下为Windows).有没有其他有效的案例不是在寻找内存泄漏时?
注意:在此特定情况下,不会创建或重新创建数据模块多次.除了那个之外,根本不会有任何内存泄漏.数据模块废料来源:
unit UDM1; interface uses SysUtils,Classes,...; type TDM1 = class(TDataModule) procedure DataModuleCreate(Sender: TObject); procedure DataModuleDestroy(Sender: TObject); procedure DoStuffWithStringList1(Sender: TObject); private internalStL: TStringList; end; var DM1: TDM1; implementation procedure TDMInterfacePAFECF.DataModuleCreate(Sender: TObject); begin internalStL := TStringList.Create(); end; procedure TDMInterfacePAFECF.DataModuleDestroy(Sender: TObject); begin internalStL.Free; //<-- IS THIS NECESSARY OR ADVISED? end; procedure DoStuffWithStringList(Sender: TObject); begin //Place some code using internalStL here... end;
解决方法
出于同样的原因,我强烈主张(轻描淡写)不在项目中留下任何编译器提示或警告,自行清理并且不要让报告的内存泄漏!
EVER!
EVER!
现在,这并不一定意味着你必须释放DataModule的析构函数中的所有东西,如果你有一个强有力的例子没有这样做,但在这种情况下,你需要注册你的内存泄漏,以便它不会被报告. (并提出一个非常明显的评论来证明并解释原因)
但考虑一下你可能离开这个项目一年后,其他人正在维护它并且有一个新的业务需求来创建多个DataModule …如果他们不能很好地了解你的代码内部,他们会相信你的代码是干净的,并且可能会出现问题.
因此,我强烈建议不要放行,除非在一个非常特殊和预期的案例中……
PS:看到这一点,并且不得不擦掉内存遍布整个地方这么多次我甚至做了一些关于内存泄漏的CodeRage会话……
Updayte:这是下载that CodeRage session的链接…