这不是一个主要的泄漏,但更多的是我认为整洁的好,但我发现我的Delphi XE代码可以泄漏一个字符串.这是因为它被定义为threadvar,因为它需要,但是当线程终止时,它显然没有整理这些变量.
有没有办法在线程终止时手动整理字符串?我只是为它分配一个空字符串,或将其设置为零或其他什么?
为其分配一个空字符串,将其设置为nil或调用Finalize()它.它们都是等效的,它们将释放存储空间,从而消除内存泄漏.
在回应Marco的评论时,文档明确指出:
通常由编译器管理的动态变量(长字符串,宽字符串,动态数组,变体和接口)可以使用threadvar声明,但编译器不会自动释放由每个执行线程创建的堆分配的内存.如果在线程变量中使用这些数据类型,则在线程终止之前,您有责任从线程内部处理它们的内存.例如:
Run Code Online (Sandbox Code Playgroud)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.
Run Code Online (Sandbox Code Playgroud)