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;
Run Code Online (Sandbox Code Playgroud)
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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2569 次 |
| 最近记录: |