共用方式為


警告 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;
}