gpt4 book ai didi

delphi - 除了寻找内存泄漏之外,是否还有另一种情况我应该在销毁应用程序时释放所有对象?

转载 作者:行者123 更新时间:2023-12-03 14:45:04 24 4
gpt4 key购买 nike

假设一个应用程序有一些表单,并且在启动时只创建了一个数据模块。在DM1.OnCreate 事件中,创建一个TStringList 以在运行时使用。我们知道,当应用程序终止时,所有东西都会被销毁,内存也会自动释放。释放某些内容可能需要一些时间,因此并不总是建议担心关闭时的内存泄漏。例如,参见this answer来自巴里·凯利或 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;

最佳答案

出于同样的原因,我强烈建议(轻描淡写)不要在项目中留下任何编译器提示或警告,自行清理,并且不要留下报告的内存泄漏!
永远!

现在,如果您有充分的理由不这样做,这并不一定意味着您必须释放 DataModule 析构函数中的所有内容,但在这种情况下,您需要注册内存泄漏

但考虑到您可能会离开这个项目,一年后,其他人正在维护它,并且有一个新的业务需求来创建多个 DataModules...很可能,如果他们不知道您的代码内部好吧,他们会相信您的代码是干净的,并且问题很可能会随之而来。

因此,我强烈建议不要释放,除非是在非常特殊、预期且有记录的情况下......

PS:看到这一点,不得不多次清理滴在各处的内存,以至于我什至参加了一些 CodeRage session 来对抗内存泄漏......

更新:这是下载链接that CodeRage session ...

关于delphi - 除了寻找内存泄漏之外,是否还有另一种情况我应该在销毁应用程序时释放所有对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9895556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com