微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Delphi字符串和引用计数

Delphi使用带字符串的引用计数.

这意味着’1234567890’只有一个内存分配
和所有a,b,c,d,e和f.s参考吗?

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;

解决方法

是的,您的具体示例中只有一个分配.如果您使用了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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐