我有这样的代码:
function Test: OleVariant;
var
r: OleVariant;
begin
r := VarArrayCreate([0, 100], varVariant);
// some other code goes here
Result := r; // does this perform deep or shadow copy?
end;
所以问题是,对于OleVariant类型,赋值操作会复制值或引用吗?
它取决于OleVariant类型吗?
答案 0 :(得分:3)
OleVariant
是Win32 OLE VARIANT
结构的包装器。 VARIANT
数据的分配始终深,因为VARIANT
没有除接口之外的任何引用计数数据的概念(在这种情况下,赋值会增加引用计数)。 VARIANT
内的数组是使用SAFEARRAY
结构实现的,该结构不是引用计数,因此必须进行深度复制(如果数组保存接口指针,则引用计数递增)。
BTW,VarArrayCreate()
返回Delphi Variant
,而不是OleVariant
。将Variant
分配给OleVariant
会将数据转换为Win32 VARIANT
结构支持的OLE兼容格式,其中包括对数组使用SAFEARRAY
。
答案 1 :(得分:1)
像这样的简单测试
function Test: OleVariant;
var
r: OleVariant;
begin
r := VarArrayCreate([0, 100], varVariant);
// some other code goes here
r[1] := 'Deep';
Result := r; // does this perform deep or shadow copy?
r[1] := 'Shallow'
end;
procedure TForm10.Button2Click(Sender: TObject);
begin
ShowMessage(Test[1]);
end;
给出答案深
评论中有一些猜测,测试用例可能是错误的,因为分配r[1] := 'Deep';
触发了一些写时复制功能。我可以确认变体的变体数组(即使是未分配的元素)的赋值是作为深层副本完成的,这里没有牛。