2015-10-04 15 views
-1

我有這樣的代碼:OleVariant在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類型嗎?

+0

你試過了'var pOleVariant:^ OleVariant;' – RepeatUntil

+0

這要看。你只想知道這個變體的答案,還是你想了解它的所有不同類型? –

+0

是的,我想知道不同的類型。 :) –

回答

3

OleVariant是Win32 OLE VARIANT結構的包裝。 VARIANT數據的作業是始終爲深,因爲VARIANT沒有除接口之外的任何引用計數數據的概念(在這種情況下,分配會增加引用計數)。 VARIANT中的數組使用SAFEARRAY結構實現,該結構不是引用計數,因此必須進行深度複製(如果數組保存接口指針,則引用計數遞增)。

BTW,VarArrayCreate()返回德爾福Variant,而不是OleVariant。將Variant指定給OleVariant可將數據轉換爲Win32 VARIANT結構支持的OLE兼容格式,其中包括將SAFEARRAY用於陣列。

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';觸發。我可以確認變體的變體數組(即使是未賦值的元素)的賦值是作爲深拷貝完成的,在這裏沒有母牛。

+0

實際上並沒有給出答案:數組可以作爲copy-on-write來實現,其中'Result:= r'將執行淺拷貝,但賦給'r [1]'會強制執行深層複製。 (我不認爲這真的發生在變體數組中,但它確實發生在Delphi的其他類型的特殊語言支持中,所以你需要排除它。) – hvd

+0

@hvd我可以向你保證,賦值一個變體數組(甚至包含未賦值的元素)是用深拷貝完成的,在這裏沒有母牛。 –

+0

我已經很確定了,我的觀點是你的答案沒有充分證明它IMO。 – hvd