加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 除了寻找内存泄漏之外,还有其他情况我应该在销毁应用

发布时间:2020-12-15 03:51:51 所属栏目:大数据 来源:网络整理
导读:假设在开始时创建具有某些表单且仅一个数据模块的应用程序. 在DM1.OnCreate事件中,创建TStringList以在运行时使用. 我们知道,当应用程序被终止时,所有内容都将被销毁,内存将自动释放.释放一些东西可能需要一些时间,因此并不总是建议担心关机时的内存泄漏.参
假设在开始时创建具有某些表单且仅一个数据模块的应用程序.
在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!

现在,这并不一定意味着你必须释放DataModule的析构函数中的所有东西,如果你有一个强有力的例子没有这样做,但在这种情况下,你需要注册你的内存泄漏,以便它不会被报告. (并提出一个非常明显的评论来证明并解释原因)

但考虑一下你可能离开这个项目一年后,其他人正在维护它并且有一个新的业务需求来创建多个DataModule …如果他们不能很好地了解你的代码内部,他们会相信你的代码是干净的,并且可能会出现问题.

因此,我强烈建议不要放行,除非在一个非常特殊和预期的案例中……

PS:看到这一点,并且不得不擦掉内存遍布整个地方这么多次我甚至做了一些关于内存泄漏的CodeRage会话……

Updayte:这是下载that CodeRage session的链接…

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读