Delphi需要free/shrink string吗?

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)

更新

  1. 类中的字符串var已经被类破坏所释放,或者我需要缩小?

例如.:

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)
  1. 在运行时库释放内存的服务(实时24/24小时)?

Rob*_*edy 12

不,没有必要释放或缩小你的字符串.两个原因:

  1. 此特定字符串是字符串文字.它没有在堆上分配.编译器在EXE中包含该字符串的文字副本,当您将其分配给aBaz该变量时,该变量直接引用EXE文件中的只读内存.什么都没有分配,所以没有什么可以免费的.

  2. 字符串通常受自动引用计数的约束.当字符串变量超出范围时(在此函数中aBaz到达end关键字时会发生这种情况),变量引用的字符串的引用计数会递减.如果结果计数为零,则运行时库将释放与该字符串关联的内存.

    编译器自动插入引用管理代码.你不需要做任何事情.


Wos*_*osi 5

不,你不需要自己释放字符串.字符串会自动管理.

aBaz将被自动释放foo已经完成.如果没有其他字符串变量包含相同的值,则将从内存中删除字符串值.