Delphi中的OleVariant按值或参考文件复制?

时间:2015-10-04 14:08:28

标签: delphi

我有这样的代码:

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类型吗?

2 个答案:

答案 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';触发了一些写时复制功能。我可以确认变体的变体数组(即使是未分配的元素)的赋值是作为深层副本完成的,这里没有牛。