当我的控制台应用程序终止时,释放内存的最佳方法是什么?
我想释放任何相关的加载DLL和我的应用程序消耗的任何其他资源。
我想释放内存中的所有东西:)
我搜索了Google,但找不到办法。
我没有在我的应用程序中使用它只是控制台应用程序
program MyAPP;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils;
/// functions
// procedures
begin
end.
答案 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”块都不会被执行。我建议你单步执行关机代码,看看它是否完全执行。
如果您发布了一些代码示例,则可能会有更具体的答案。