加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi字符串和引用计数

发布时间:2020-12-15 09:50:11 所属栏目:大数据 来源:网络整理
导读: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:
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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读