我很好奇,因爲我無法在MSDN上了解到這一點。我發現Release()
函數存在於我明顯應該用於刪除指針的各種COM對象中。但我不確定它究竟返回了什麼?我曾經以爲它會返回仍然存在剩餘的對象引用的數量,因此是這樣的:Microsoft對象,Release()函數返回值?
while(pointer->Release() > 0);
顯然釋放到該指針的所有引用?
還是我沒有看到什麼?
*注意我是從IDirect3DTexture9::Release()
功能
我很好奇,因爲我無法在MSDN上了解到這一點。我發現Release()
函數存在於我明顯應該用於刪除指針的各種COM對象中。但我不確定它究竟返回了什麼?我曾經以爲它會返回仍然存在剩餘的對象引用的數量,因此是這樣的:Microsoft對象,Release()函數返回值?
while(pointer->Release() > 0);
顯然釋放到該指針的所有引用?
還是我沒有看到什麼?
*注意我是從IDirect3DTexture9::Release()
功能
你理論的概念說起這是真的。 COM內存管理基於引用計數。 IUnknown
接口的Release
方法將遞減引用計數並將其返回。該功能不會發布參考文獻。它不知道誰擁有參考。它只是減少引用計數,直到達到零,然後對象將被破壞。這是危險的,因爲其他人可能仍然持有對它的引用,在對象被破壞後將會失效。
因此,您應該只爲以前調用的每個AddRef
調用Release
。
除了Mehrdad所說的之外,Release的返回值僅用於調試目的。生產代碼應該忽略它。
循環直到發佈()返回0肯定是一個錯誤 - 你永遠不應該釋放你不擁有的引用。
Release()將返回對象的當前引用計數。但你不應該這樣做:
while(pointer->Release() > 0);
這將使引用計數爲零並銷燬對象。
在COM一個簡單的經驗法則是每一個的AddRef() 應該有相應的 發行()(只有一個)。
通常發行()實施應該是這樣的:
int nCount = InterlockedDecrement(&this->m_cRef); //Decrement the ref count
if (nCount == 0)
{
delete this;
}
return nCount;