这不是一个主要的泄漏,但更多的是我觉得整洁很好,但我发现我的Delphi XE代码can leak a String。这是因为它被定义为threadvar,因为它需要,但是当线程终止时,它显然没有整理这些变量。
有没有办法让我在终止线程时手动整理字符串?我只是给它分配一个空字符串,或者将它设置为nil或者什么?
答案 0 :(得分:5)
为其指定一个空字符串,将其设置为nil或在其上调用Finalize()
。它们都是等效的,它们将释放存储空间,从而消除内存泄漏。
在回应Marco的评论时,documentation明确表示:
通常的动态变量 由编译器管理(长字符串, 宽字符串,动态数组, 变体和接口)可以 用threadvar声明,但是 编译器不会自动释放 由堆创建的堆分配的内存 每个执行线程。如果你使用 这些数据类型在线程变量中, 你有责任处置 从他们内心的记忆 线程在线程终止之前。 例如:
threadvar S: AnsiString; S := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; ... S := ; // free the memory used by S
相当奇怪的是,文档在最后一行中包含一个明确的错误,该错误应该是S := nil;
当然很容易看出线程局部变量没有自动处理:
program LeakMe;
{$APPTYPE CONSOLE}
threadvar
s: string;
begin
ReportMemoryLeaksOnShutdown := True;
s := 'Leak me';
end.
答案 1 :(得分:3)
其他一些小解决方案 - 你可以在这里使用ShortString而不是String(或任何其他类型的固定长度数组),然后内存泄漏消失