gpt4 book ai didi

arrays - 两条记录共享相同的值?

转载 作者:行者123 更新时间:2023-12-03 15:52:18 25 4
gpt4 key购买 nike

我问another question关于与运算符(operator)一起使用记录。在测试过程中,我发现了一个异常现象,即这种类型的两个实例似乎共享相同的内存。

该记录有一个整数数组...

type
TVersion = record
Values: array of Integer;
function Count: Integer;
class operator implicit(aVersion: TVersion): String;
class operator implicit(aVersion: String): TVersion;
end;

class operator TVersion.implicit(aVersion: TVersion): String;
var
X: Integer;
begin
Result:= '';
for X := 0 to Length(aVersion.Values)-1 do begin
if X > 0 then Result:= Result + '.';
Result:= Result + IntToStr(aVersion.Values[X]);
end;
end;

class operator TVersion.implicit(aVersion: String): TVersion;
var
S, T: String;
I: Integer;
begin
S:= aVersion + '.';
SetLength(Result.Values, 0);
while Length(S) > 0 do begin
I:= Pos('.', S);
T:= Copy(S, 1, I-1);
Delete(S, 1, I);
SetLength(Result.Values, Length(Result.Values)+1);
Result.Values[Length(Result.Values)-1]:= StrToIntDef(T, 0);
end;
end;

function TVersion.Count: Integer;
begin
Result:= Length(Values);
end;

现在我尝试实现这个......

var
V1, V2: TVersion;
begin
V1:= '1.2.3.4';
V2:= V1;
ShowMessage(V1);
ShowMessage(V2);
V2.Values[2]:= 8;
ShowMessage(V1);
ShowMessage(V2);
end;

我预计 V2 应为 1.2.8.4V1 仍为 1.2.3.4。但是,V1 也更改为 1.2.8.4

分配这些记录时如何保持它们独立?

最佳答案

此行为是设计使然。动态数组变量是一个指针。当您分配动态数组变量时,您会获取指针的副本并增加引用计数。当然,当您分配包含动态数组的复合结构时,也会发生这种情况。

documentation涵盖这个:

If X and Y are variables of the same dynamic-array type, X := Y points X to the same array as Y. (There is no need to allocate memory for X before performing this operation.) Unlike strings and static arrays, copy-on-write is not employed for dynamic arrays, so they are not automatically copied before they are written to.

为了获得对此的心理模型,动态数组的 this 是引用,就像类和接口(interface)一样。这与简单类型(整数、 double 等)、字符串、记录等形成对比。

处理此问题的标准方法如下:

  1. 将动态数组设为私有(private)。
  2. 通过属性公开数组的内容。
  3. 在元素 setter 中,确保对动态数组的引用是唯一的。

最后一步是棘手的​​部分。通过调用 SetLength 使动态数组引用唯一:

SetLength(arr, Length(arr));

SetLength 做出的 promise 之一是它始终使其第一个参数是唯一的。

这具有实现写时复制的效果。据我所知,不可能实现赋值时复制,因为编译器没有为您提供赋值运算符的钩子(Hook)。

所以答案是:

How do I keep these records independent when I assign them?

你不能。您需要改用写时复制。

关于arrays - 两条记录共享相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22034632/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com