【发布时间】:2013-08-22 08:07:00
【问题描述】:
FastMM 报告以下代码 sn-p 的内存泄漏 (UnicodeString),该代码使用带有字符串的记录线程变量:
program Project10;
{$APPTYPE CONSOLE}
{$R *.res}
uses
FastMM4,
System.SysUtils;
type
TContext = record
Value : String;
end;
threadvar
Context : TContext;
begin
Context.Value := 'asdfsdfasfdsa';
end.
这是真正的内存泄漏,还是在 FastMM 检查内存泄漏后才清理线程变量?
更重要的是:我如何才能抑制报告这些“内存泄漏”,因为它们会混淆可能发现的任何其他内存泄漏?
【问题讨论】:
-
我相信线程必须清理动态值?尝试在线程清理代码中添加 Context.Value := ''。
-
这是我的日志代码的一部分,所以我无法控制线程清理,因为这可能会从任何线程调用。
-
如果你无法访问线程,那你为什么要使用线程变量开始呢?你到底在用它们做什么?由于您不控制线程,我知道检测线程终止的唯一其他方法是编写和加载 DLL,以便您可以接收
DLL_THREAD_DETACH通知。但随后 DLL 将需要管理线程变量内存,除非您跨 DLL 边界共享 FastMM。 -
@Remy 在这种情况下您不需要共享 FastMM。 DLL 将是微不足道的。加载它并调用它导出的函数,传递回调以接收通知。然后这些通知可以在主机的上下文中运行。
-
@DavidHeffernan 我试过了,它确实报告了 XE2 的泄漏。请注意,我包括 FastMM4 单元。
标签: delphi memory-leaks delphi-xe2 fastmm