2011-08-17 155 views
-1

我有一個問題關於分配在這裏,我想知道分配一個對象引用變量

  1. Assign是否使整個對象的副本,並
  2. 我想知道FTEA.Objects[0]是否也是釋放。

我想打的FTEA.Objects[0]副本,當我自由ObjCur,我不打算釋放FTEA.Objects[0] - 不知道這樣做的正確的方式,需要你的幫助,感謝:

function xxxxxxxxxxxxxxxxxxxxxxxx 
var 
    curQuo, tempQuo:TXX_TEA; 
begin 
    curQuo :=TXX_TEA(FTEA.Objects[0]); 
    if xxxxxxxxx then 
    begin 
    tempQuo := TXX_TEA.Create(); 
    tempQuo.Assign(curQuo); // Question 1: Assign copy the whole object value or not 
    objCur.AddQuo(tempQuo) 
    end 
    else 
    TXX_TEA(objCur.Quos[0]).Assign(curQuo); 
    end; 

    finally 
    objCur.Free; // Question 2: FTEA.Objects[0] is freed or not 
    end; 
end 
+0

Downvoted for useless question。 –

+0

@spspli:我同意@Warren(雖然我沒有downvote)。嘗試發佈使用諸如「函數xxxxxxxxxxxxxxxxxxxxxxxx」和「if xxxxxxx」和「TXX_TEA」之類的代碼的示例代碼會使其難以閱讀和理解。發佈您的實際代碼(僅進行必要的更改以實現隱私等等)。發佈無用的示例代碼使得難以給你有用的答案。 –

回答

3

賦值是每個類必須實現的例程,因此它可以完成它所編程的任務。它是假設嘗試複製作爲參數傳遞的整個對象,以及它可以。但如果它不能,它可能不應該複製任何東西。

某些類可能具有不符合該非強制「合同」的實現,只複製他們所需的部分。換句話說,被複制的內容完全取決於實現。

賦值沒有特別的意義,並且是一個正常的函數,而不是某種編譯器的魔法。它不會對作爲參數傳遞的對象做任何事情,因此釋放一個對象不會影響另一個對象。這些對象是完全獨立的。

請注意,並非所有類都實現了Assign。你可能認爲你爲該類調用Assign,但它實際上可能是繼承的Assign,它不知道派生類中的任何新成員將被複制。 Assign的概念很好,但不幸的是,它通常沒有實現,或者沒有正確實施。

+0

我檢查了代碼,分配正確執行,它分配了每個屬性。謝謝你的答案.FTEA.Objects [0]在這裏沒有釋放。 – spspli

+0

很高興知道它實現了正確分配。在第三方代碼中,IME並非總是如此。 –

5

不,釋放一個已從另一個對象分配的對象不會釋放源對象。

Assign的功能如何完全取決於班級。每個類必須實現Assign,然後調用繼承,並且如果類是兼容的,則將它自己的自定義屬性從源分配到目標。我建議查看這些類的源代碼來檢查它們是否實現了Assign。

+0

我檢查他們實現分配和分配每個屬性從源到類對象。所以tempQuo.Assign(curQuo)你認爲它會將curQuo對象的每個屬性指向tempQuo對象? – spspli

+7

Spspli,而不是問什麼一羣陌生人他們認爲*會發生什麼,爲什麼不直接運行你的代碼和*看看*屬性是否被複制到新對象?你已經被告知應該發生什麼,所以檢查一下。這是編程,而不是哲學。 –

+0

@Rob:+1爲「編程,而不是哲學」。當我看到兩個程序員在工作時,總是會在我的工作中爭論X在程序中做X會產生效果Y還是產生Z.有時我會厭倦並告訴他們:「運行它,看看會發生什麼! –

相關問題