pKa*_*ian 6 delphi string memory-management reference
Delphi使用带字符串的引用计数.
这是否意味着'1234567890'只有一个内存分配,所有a,b,c,d,e和fs都参考它?
 type  
   TFoo = class
    s: string;
   end;
  const 
    a = '1234567890';
    b = a;
    c : string = a;
  var
    d: string;
    e: string;
    f: TFoo;
  function GetStr1(const s: string): string;
  begin
   Result := s;
  end;
  function GetStr2(s: string): string;
  begin
   Result := s;
  end;
  begin
   d := GetStr1(b);
   e := GetStr2(c);
   f := TFoo.Create;
   f.s := a;
  end;
Bar*_*lly 10
是的,您的具体示例中只有一个分配.如果您曾经使用过UniqueString,如mghie所说,或者您是否动态构建了字符串,那么即使字符串内容与其他字符串相同,您最终也会得到新的字符串分配.
但是,关于您的具体示例有一个有趣的事实:实际上根本没有为字符串"1234567890""分配"内存.字符串常量的数据存储在磁盘上的可执行映像中,并在代码访问时由OS分页.它占用内存地址空间,作为整个可执行模块的内存映射的一部分,但由于它由磁盘上的原始可执行文件支持,因此它不构成进程提交的内存的一部分,并且不需要支持页面文件.
例如,此程序将在运行时报告访问冲突:
{$apptype console}
uses SysUtils;
const
  s = '1234567890';
procedure Change(const r: string);
var
  p: PChar;
begin
  p := PChar(r);
  p^ := 'x';
end;
begin
  try
    Change(s);
  except
    on e: Exception do
      Writeln(e.Message);
  end;
end.
| 归档时间: | 
 | 
| 查看次数: | 2569 次 | 
| 最近记录: |