【问题标题】:Console Application On Termination终止时的控制台应用程序
【发布时间】:2011-11-15 09:05:26
【问题描述】:

当我的控制台应用程序终止时释放内存的最佳方法是什么?

我想释放任何相关加载的 DLL 和我的应用程序消耗的任何其他资源。

我想释放内存中的所有东西:)

我在 Google 上进行了搜索,但找不到执行此操作的方法。

我没有在我的应用程序中使用 Units,它只是控制台应用程序

program MyAPP;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

/// functions 
// procedures 

begin
end.

【问题讨论】:

  • “当我的控制台应用程序终止时释放内存的最佳方法是什么?”实际上有一个很好的论点,最好什么都不做,让系统回收内存

标签: delphi console-application terminate


【解决方案1】:
begin

  try
    // Your entire program goes here.
  finally
    SomeFunction;
  end;

end.

【讨论】:

  • 这与终止无关?它只是尝试一些东西然后最终释放它?
  • @user1023395:我不太确定我是否理解您想要实现的目标。也许你可以详细说明一下?
  • 在应用程序退出时我想调用一些函数
  • @user 这绝对与终止有关。如果您不准备告诉我们您的代码是什么样的并让我们猜测,那么您期望什么样的答案? +1
  • 如果用户按下 Ctrl+C 会调用 SomeFunction 吗?
【解决方案2】:

当您的应用程序终止由它直接或由 Delphi 内部分配器 (TObject.Create / InitInstance) 或由模块分配的所有内存时,操作系统会释放。

程序终止后,即使应用程序中的内存泄漏也不是问题。您可以使用 FastMM4 库检查内存泄漏。

Windows 还应该释放您通过初始化调用 GDIPlus 等专用库获得句柄的对象,但这些对象应在使用它们的代码的本地范围内对象实例过时后手动释放。

对于所有代码内释放,您应该使用 try..finally。所以你的 program.dpr 可能看起来像:

program YourProgram;
{$APPTYPE CONSOLE}

uses
  MainUnit;

var
  main: TProgramMain
begin
  main := TProgramMain.Create;
  try
    main.Execute;
  finally
    main.Free;
  end;
end.

【讨论】:

【解决方案3】:

您还没有展示您创建了哪些对象,但无论您为创建这些对象做了什么,如果您愿意,反过来就是如何释放它们。

请注意,如果您的对象只是在堆中消耗内存,您可以让 Windows 回收您的进程使用的所有内存,这样做的副作用(如果没有的话)可能包括您的微型应用程序关闭得更快.

尽管如此,大多数尽职尽责的开发人员选择完全释放他们创建的每个对象。如果您创建了这样的对象:

  x := TMyObject.Create;

.. 然后你通过调用 Free 来释放它:

   x.Free;

如果对象是一个组件,归其父级所有,则不需要释放它。

如果对象是接口对象(引用计数),您只需像这样放开您的引用:

   x := nil;

如果所讨论的类型是值类型(Double、Integer),那么您不必释放它。

如果有问题的类型是自动管理的(记录、字符串),您也不必释放它。

如果您的对象分配了更多对象,则释放它们的正确位置是该对象的析构函数。

这些是规则。跟着他们走,你就不会漏水了。您的控制台应用程序以您未指定的方式终止。您是否期待对未指明的问题有一些神奇的答案?如果是我,我会确保我的应用程序有序关闭,并且在正常关闭期间,它会释放其资源。如果它异常终止,那么您编写的任何“try..finally”块都不会被执行。我建议您单步执行关闭代码,以查看它是否完全执行。

如果您发布了一些代码示例,那么可能会有更具体的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多