ar0*_*968 2 delphi string memory-management
在这个例子中,在服务器服务中(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;
Run Code Online (Sandbox Code Playgroud)
更新
例如.:
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;
Run Code Online (Sandbox Code Playgroud)
Rob*_*edy 12
不,没有必要释放或缩小你的字符串.两个原因:
此特定字符串是字符串文字.它没有在堆上分配.编译器在EXE中包含该字符串的文字副本,当您将其分配给aBaz该变量时,该变量直接引用EXE文件中的只读内存.什么都没有分配,所以没有什么可以免费的.
字符串通常受自动引用计数的约束.当字符串变量超出范围时(在此函数中aBaz到达end关键字时会发生这种情况),变量引用的字符串的引用计数会递减.如果结果计数为零,则运行时库将释放与该字符串关联的内存.
编译器自动插入引用管理代码.你不需要做任何事情.