com本質論--IUnKnown十條制導準則

調用AddRef方法的情形:

1 當把一個非空接口指針寫到局部變量中時.

2 當被調用方把一個非空接口指針寫到方法或者函數的[ont]或則[in,out]參數中時.

3 當被調用方返回一個非空接口指針作爲函數的實際結果時.

4 當把一個非空接口指針寫到對象的一個數據成員中時.

調用Release方法的情形:

1 在改寫一個非空局部變量或者數據成員之前.

2 在離開非空局部變量的作用域(scope)之前.

3 當被調用方要改寫方法或者函數的[in,out]參數,並且參數的初始值爲非空時.([out]參數往往被假定"輸入時爲空值",所以被調用方永遠也不必釋放[out]參數.

4 在改寫一個對象的非空數據成員之前.

5 在離開一個對象的析構函數之前,並且這時還有一個非空接口指針作爲數據成員.

 當把接口指針作爲[in]參數傳給函數時的特殊規則:

1 當調用方把一個非空接口指針通過[in]參數傳給一個函數或者方法時,既不需要調用AddRef,也不需要調用Release,因爲在調用堆棧中,臨時變量的生命週期只是"用於初始化形式參數"的表達式的生命週期的一個子集.

如果拜讀過候捷老師譯的書<<inside面向對象模型>>的話,對這十條準則就比較好理解,連繫到C++中拷貝構造函數和賦值函數與把對象作爲值傳遞給成員函數和把對象作爲返回值返回的關係做對比就好多了,很慶幸沒有錯過<<COM本質論>>,儘管這本書纔剛剛開始讀,卻已經收益非淺,對dotNet的前身至少也有了個大體的輪廓.其中interface從struct發展而來的事實讓我覺得不可思議.不支持多繼承的原因竟然是爲了基類的二進制表示與編譯器無關.不知道後面還會有什麼發現.期待啊......

事實證明,DON BOX的大作是絕對不能放過的.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章