如何最终确定threadvar字符串以防止泄漏?

时间:2011-03-28 08:20:27

标签: delphi delphi-xe

这不是一个主要的泄漏,但更多的是我觉得整洁很好,但我发现我的Delphi XE代码can leak a String。这是因为它被定义为threadvar,因为它需要,但是当线程终止时,它显然没有整理这些变量。

有没有办法让我在终止线程时手动整理字符串?我只是给它分配一个空字符串,或者将它设置为nil或者什么?

2 个答案:

答案 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(或任何其他类型的固定长度数组),然后内存泄漏消失