在此示例中,在服务器服务(24/24 小时实时)中,我是否需要释放/收缩 aBaz
以释放清理/内存?
function foo(const aBar : string) : boolean;
var
aBaz : string;
begin
aBaz := 'very very long string';
Result := (aBar = aBaz);
aBaz := ''; // shrink `aBaz` for free memory
end;
更新
- 类中的字符串变量已经被类销毁释放了,或者我需要收缩?
例如:
class Foo = class
FBar : string;
public
constructor Create; overload;
destructor Destroy; reintroduce;
end;
constructor Foo.Create(const ABar : string);
begin
FBar := ABar;
end;
destructor Foo.Destroy;
begin
FBar := ''; // destructor already free memory or I need to shrink?
end;
- 在服务(24/24 小时实时)中,当运行时库释放内存时?
最佳答案
不,无需释放或收缩字符串。两个原因:
这个特定的字符串是一个字符串文字。它没有分配在堆上。编译器在 EXE 中包含该字符串的文字副本,当您将其分配给 aBaz 时,该变量直接引用 EXE 文件中的只读内存。没有分配任何内容,因此没有可以释放的内容。
字符串通常会受到自动引用计数的影响。当字符串变量超出范围时(这就是当您到达此函数中的
end
关键字时aBaz
发生的情况),该变量引用的字符串将具有其引用计数递减。如果结果计数为零,则运行时库将释放与该字符串关联的内存。编译器自动插入引用管理代码。您无需对其执行任何操作。
关于string - Delphi需要释放/收缩字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33484006/