2013-04-03 64 views
0

如果我使用reinterpret_castIInspectable*轉換爲Object^,我仍然負責釋放原始的IInspectable*reinterpret_cast從raw指針到hatted指針的引用計數規則是什麼?

顯然,當它超出範圍的生產Object^會釋放自己,所以真正的問題是使用reinterpret_cast是否意味着一個的AddRef,賦予Object^它自己的引用計數,或者需要我已經有了參考的所有權。

似乎有成爲爭論的期望兩種方式:一方面,一個COM操作不應該接管其輸入指針的引用計數 - 在另一方面,該名reinterpret_cast表明,它只是重新詮釋我從「原始ABI指針」到「指向已有擁有對該對象的引用」的位,並且這將是我的工作,以確保這是有意義的)。

回答

2

A reinterpret_cast<Object^>(iinsp)調用本身將沒有與refcounting相關的副作用,但是,將該cast的結果賦值給Object^變量將導致在原始的Inspectable指向的對象上發生addref。當Object^變量超出範圍或分配給null時,將同樣在基礎對象上調用Release()。是否導致對象超出範圍將取決於它在整個業務之前的內部引用。例如:

void foo(IInspectable* p) { //assume: this comes in with a single refcount 
    p->AddRef(); // refcount now 2 
    reinterpret_cast<Object^>(p); //refcount still 2 
    { 
    Object^ o = reinterpret_cast<Object^>(p); //refcount now 3 
    } //o goes out of scope, refcount now 2 

    p->Release(); // refcount now 1 
} //refcount is still 1, the caller of function foo is responsible for cleaning him up 
+0

一般來說,我認爲reinterpret_cast是相當「愚蠢」的。它只是強制編譯器採取原始指針值,忽略源類型,並使其相信它是目標類型,即使這兩種類型無關。這在一般情況下是危險的,但在這種特殊情況下是可以的(因爲這些類型具有相同的佈局)(對象^)。 –

+0

因演員而添加一個引用似乎沒有必要;如果臨時存在的時間只有在表達式結束時才存在,那麼爲什麼它需要一個額外的refcount/release週期?如果編譯器確實有這種行爲,我想我會認爲這會是一個錯誤。 –