警告 C28616
多線程AV條件
這個警告表示線程在先佔時可能會存取已刪除的物件。
備註
在參考計數為零之後,不應存取參考計數的物件。
程式代碼分析名稱:INTERLOCKEDDECREMENT_MISUSE1
範例
下列程式代碼會產生這個警告。 這是可能會公開此問題的線程時間序列範例。 在此範例中, m_cRef
是 的成員 this
:
線程 T1 會 if
執行條件、遞減 m_cRef
為 1,然後先佔。
另一個線程 T2 會 if
執行條件、遞減 m_cRef
為 0、執行 if
主體 (其中 this
刪除) ,並傳 NULL
回 。
重新排程 T1 時,它會在第 9 行參考 m_cref
。 因此,它會在刪除相關 this
指標之後存取成員變數,以及在對象的堆積處於未知狀態時。
ULONG CObject::Release()
{
if (0 == InterlockedDecrement(&m_cRef))
{
delete this;
return NULL;
}
/* this.m_cRef isn't thread safe */
return m_cRef;
}
下列程式代碼不會在刪除對象之後參考任何堆積記憶體。
ULONG CObject::Release()
{
ASSERT(0 != m_cRef);
ULONG cRef = InterlockedDecrement(&m_cRef);
if (0 == cRef)
{
delete this;
return NULL;
}
return cRef;
}