这是最近Delphi版本中的一个错误。我刚在最近的免费Delphi 10.1 Starter上检查过,它的行为与您描述的一样 - 但由于它没有提供RTL源代码,我无法检查确切的原因。
在Delphi XE2中,它的行为符合预期:创建任务模态对话框并等待用户响应,就像Sertak所描述的那样。
在Delphi 10.1中,内存泄漏确实被报告到控制台窗口,但程序不会停止等待用户处理。这是一个糟糕的解决方案,因为它可能被用于脚本(CMD或PS脚本可能会将此消息与合法输出混淆并导致后续程序执行失败)。
我认为您需要在Delphi 10.0上开启回归型错误报告 - 但我认为他们在10.2版发布之前不会修复它。
我还把您的应用程序从Delphi分叉的内存管理器切换到原始管理器,然后错误行为被撤销了:程序显示了消息框,并在退出到IDE之前等待我关闭它。
目前,我建议您使用上述原始内存管理器而非其分叉版本。
program Project1;
{$APPTYPE CONSOLE}
uses
FastMM4,
System.Classes,
System.SysUtils;
...
原始内存管理器位于http://github.com/pleriche/FastMM4。
您可以在Delphi中使用Git客户端或独立的Git客户端来保持更新,或者只下载一次代码并停止更新,由您决定。
相关代码摘录如下:
{$ifdef LogErrorsToFile}
LMsgPtr := AppendStringToBuffer(LeakMessageFooter, LMsgPtr, Length(LeakMessageFooter));
AppendEventLog(@LLeakMessage[0], UIntPtr(LMsgPtr) - UIntPtr(@LLeakMessage[1]));
{$else}
AppendStringToBuffer(LeakMessageFooter, LMsgPtr, Length(LeakMessageFooter));
{$endif}
{$ifdef UseOutputDebugString}
OutputDebugStringA(LLeakMessage);
{$endif}
{$ifndef NoMessageBoxes}
AppendStringToModuleName(LeakMessageTitle, LMessageTitleBuffer);
ShowMessageBox(LLeakMessage, LMessageTitleBuffer);
{$endif}
end;
end;
{$endif}
end;
并且
procedure ShowMessageBox(AText, ACaption: PAnsiChar);
begin
if (not ShowingMessageBox) and (not SuppressMessageBoxes) then
begin
ShowingMessageBox := True;
MessageBoxA(0, AText, ACaption,
MB_OK or MB_ICONERROR or MB_TASKMODAL or MB_DEFAULT_DESKTOP_ONLY);
ShowingMessageBox := False;
end;
end;
这段代码依赖于在桌面Windows上运行,因此Embarcadero可能尝试“修复”它以使其跨平台。然而,他们这样做使其在Windows控制台上出现故障......此外,考虑使用其他形式的日志记录 - 将其写入文件中和/或将其写入Windows调试字符串中。它们不会像模态窗口那样吸引注意力,但至少可以帮助您保存信息,如果您知道在哪里查找它们的话。
AutoConsole
单元,详情请见这里:http://rvelthuis.blogspot.de/2016/07/new-velthuisautoconsole-unit.html。只需将其添加到您的控制台程序中即可。 - Rudy Velthuissystem.end.
上的断点也可以正常工作。 - Tom Brunberg