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

mj2*_*008 5 delphi delphi-xe

这不是一个主要的泄漏,但更多的是我认为整洁的好,但我发现我的Delphi XE代码可以泄漏一个字符串.这是因为它被定义为threadvar,因为它需要,但是当线程终止时,它显然没有整理这些变量.

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

Dav*_*nan 5

为其分配一个空字符串,将其设置为nil或调用Finalize()它.它们都是等效的,它们将释放存储空间,从而消除内存泄漏.


在回应Marco的评论时,文档明确指出:

通常由编译器管理的动态变量(长字符串,宽字符串,动态数组,变体和接口)可以使用threadvar声明,但编译器不会自动释放由每个执行线程创建的堆分配的内存.如果在线程变量中使用这些数据类型,则在线程终止之前,您有责任从线程内部处理它们的内存.例如:

threadvar
  S: AnsiString;

S := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  ...
S := ;  // free the memory used by S
Run Code Online (Sandbox Code Playgroud)

相当奇怪的是,文档在最后一行中包含了应该读取的明确错误 S := nil;

当然很容易看到线程局部变量没有自动处理:

program LeakMe;

{$APPTYPE CONSOLE}

threadvar
  s: string;

begin
  ReportMemoryLeaksOnShutdown := True;
  s := 'Leak me';
end.
Run Code Online (Sandbox Code Playgroud)