string - Delphi需要释放/收缩字符串吗?

标签 string delphi 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;

更新

  1. 类中的字符串变量已经被类销毁释放了,或者我需要收缩?

例如:

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 小时实时)中,当运行时库释放内存时?
  • 最佳答案

    不,无需释放或收缩字符串。两个原因:

    1. 这个特定的字符串是一个字符串文字。它没有分配在堆上。编译器在 EXE 中包含该字符串的文字副本,当您将其分配给 aBaz 时,该变量直接引用 EXE 文件中的只读内存。没有分配任何内容,因此没有可以释放的内容。

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

      编译器自动插入引用管理代码。您无需对其执行任何操作。

    关于string - Delphi需要释放/收缩字符串吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33484006/

    相关文章:

    javascript - 使用javascript计算行数

    r - 如何在数据框其他列的一列中搜索字符串

    c - 在不使用 C 中任何库的情况下从 char 数组中删除子字符串

    java - 如何使用字符串替换的反向引用作为 Java 中 HashMap 的键?

    c++ - 自定义分配器和内存对齐

    delphi - 颜色阵列

    delphi - Delphi 2007 IDE 中禁用了调试按钮。为什么?

    python - 检测反射 DLL 注入(inject)

    Java:引用意味着多少内存?

    c++ - 如何一次重置大量类成员,而不是在析构函数中?