2009-05-20 48 views
6

我很好奇,因爲我無法在MSDN上了解到這一點。我發現Release()函數存在於我明顯應該用於刪除指針的各種COM對象中。但我不確定它究竟返回了什麼?我曾經以爲它會返回仍然存在剩餘的對象引用的數量,因此是這樣的:Microsoft對象,Release()函數返回值?

while(pointer->Release() > 0); 

顯然釋放到該指針的所有引用?

還是我沒有看到什麼?

*注意我是從IDirect3DTexture9::Release()功能

回答

10

你理論的概念說起這是真的。 COM內存管理基於引用計數。 IUnknown接口的Release方法將遞減引用計數並將其返回。該功能不會發布參考文獻。它不知道誰擁有參考。它只是減少引用計數,直到達到零,然後對象將被破壞。這是危險的,因爲其他人可能仍然持有對它的引用,在對象被破壞後將會失效。

因此,您應該只爲以前調用的每個AddRef調用Release

11

除了Mehrdad所說的之外,Release的返回值僅用於調試目的。生產代碼應該忽略它。

循環直到發佈()返回0肯定是一個錯誤 - 你永遠不應該釋放你不擁有的引用。

6

Release()將返回對象的當前引用計數。但你不應該這樣做:

while(pointer->Release() > 0); 

這將使引用計數爲零並銷燬對象。

在COM一個簡單的經驗法則是每一個的AddRef() 應該有相應的 發行()(只有一個)。

通常發行()實施應該是這樣的:

int nCount = InterlockedDecrement(&this->m_cRef); //Decrement the ref count 
if (nCount == 0) 
{ 
    delete this; 
} 
return nCount;