Delphi需要free / shrink string吗?

时间:2015-11-02 18:03:22

标签: string delphi memory-management

在这个例子中,在服务器服务中(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;

更新

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

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

2 个答案:

答案 0 :(得分:12)

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

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

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

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

答案 1 :(得分:5)

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

aBaz完成后,

foo将自动释放。如果没有其他字符串变量包含相同的值,则将从内存中删除字符串值。