终端上的控制台应用程序

时间:2011-11-13 17:34:30

标签: delphi console-application terminate

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

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

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

我搜索了Google,但找不到办法。

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

program MyAPP;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

/// functions 
// procedures 

begin
end.

3 个答案:

答案 0 :(得分:7)

begin

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

end.

答案 1 :(得分:0)

当您的应用程序直接或通过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.

答案 2 :(得分:0)

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

请注意,如果您的对象只是在堆中消耗内存,您可以让Windows回收您的进程使用的所有内存,并且这种副作用(如果没有)可能包括您的小应用程序更快关闭。

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

  x := TMyObject.Create;

..然后你可以通过免费电话来释放它:

   x.Free;

如果对象是其父级拥有的组件,则无需释放它。

如果对象是一个接口对象(引用计数),你只需要放弃你的引用:

   x := nil;

如果有问题的类型是值类型(Double,Integer),那么您不必释放它。

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

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

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

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