【问题标题】:Calling ExitProcess(0) in console app doesn't show memory leaks在控制台应用程序中调用 ExitProcess(0) 不会显示内存泄漏
【发布时间】:2018-04-03 12:23:27
【问题描述】:

我想在控制台应用程序中显示内存泄漏,但是在使用 ExitProcess(0) 时它不会显示它们,没有它我不知道如何退出应用程序。

这是一个创建内存泄漏但没有显示的代码示例:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  sysutils, classes, windows;

function Test: Boolean;
var
   test : TStringList;
begin
  test := TStringList.Create;
  ExitProcess(0);
end;

begin
  try
    ReportMemoryLeaksOnShutdown := true;
    Test;
  except
    on E: Exception do
    begin
      Writeln(E.ClassName, ': ', E.Message);
      REadln;
    end;
  end;
end.

要查看内存泄漏,我从 cmd 执行 exe。现在,如果我评论 ExitProcess 我可以看到它们,但我不能。有解决办法吗?

【问题讨论】:

  • 我不知道如何退出应用程序。它会自行退出,因为您没有可以让它继续运行的循环。 IOW,只要在创建 TStringList 时没有引发异常,如果 ExitProcess 调用被删除,它将在该行执行后立即退出控制台应用程序。您的整个应用程序可以精简为大约 6 或 8 行代码。
  • 您在内存管理器显示任何内容之前退出进程,您期望什么?
  • 如果您想提前退出,请使用“退出”或“暂停”。这不会干扰内存管理器释放/扫描/报告内存。
  • @SertacAkyuz 实际应用程序还有另一个读取命令的功能。所以如果我在那里退出它只会退出该功能。在控制台应用程序中,您可以编写不同的命令,这就是我使用 ExitProcess 的原因,因为我可以从函数中调用它,它会关闭应用程序本身。 Exit 只是退出当前函数。

标签: delphi memory-leaks console delphi-10.1-berlin


【解决方案1】:

ExitProcess 退出调用进程。就过程而言,该函数甚至不返回。因此内存管理器找不到机会扫描和报告内存泄漏。

您必须使用其他方式退出您的应用程序。你可以使用Halt,或者在函数中引发异常,或者从函数中返回一些东西,告诉主程序它会退出。

【讨论】:

  • 很酷,我做到了,所以一个函数返回了一些东西,我在 main 中调用了 exit,它显示了内存泄漏。不错。
猜你喜欢
  • 2011-05-29
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多