在这个例子中,在服务器服务中(24/24小时直播),我是否需要释放/缩小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;
更新
例如:
<div class="container-div">
<ul class="level1">
<li>Item
<ul class="level2">
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
</ul>
</li>
<li>Item
<ul class="level2">
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
</ul>
</li>
<li>Item
<ul class="level2">
<li>Item</li>
<li>Item</li>
<li>Item</li>
</ul>
</li>
<li>Item
<ul class="level2">
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
</ul>
</li>
<li>Item
<ul class="level2">
<li>Item</li>
<li>Item</li>
<li>Item</li>
</ul>
</li>
<li>Item
<ul class="level2">
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
<li>Item</li>
</ul>
</li>
</ul>
</div>
答案 0 :(得分:12)
不,没有必要释放或缩小你的字符串。有两个原因:
此特定字符串是字符串文字。它没有在堆上分配。编译器在EXE中包含该字符串的文字副本,当您将其分配给aBaz
时,该变量直接引用EXE文件中的只读内存。什么都没有分配,所以没有什么可以免费的。
字符串一般需要自动引用计数。当字符串变量超出范围时(当您在此函数中到达aBaz
关键字时,end
会发生这种情况),变量引用的字符串的引用计数会递减。如果结果计数为零,则运行时库将释放与该字符串关联的内存。
编译器自动插入引用管理代码。你不需要做任何事情。
答案 1 :(得分:5)
不,你不需要自己释放字符串。字符串会自动管理。
aBaz
完成后, foo
将自动释放。如果没有其他字符串变量包含相同的值,则将从内存中删除字符串值。