Warning C28616
Multithreaded AV condition
This warning indicates that a thread has potential to access deleted objects if preempted.
Remarks
There should be no access to a reference-counted object after the reference count is at zero.
Code analysis name: INTERLOCKEDDECREMENT_MISUSE1
Example
The following code generates this warning. This is an example of threading time sequence that could expose this problem. In this example, m_cRef
is a member of this
:
A thread T1 executes the if
condition, decrements m_cRef
to 1, and is then preempted.
Another thread T2 executes the if
condition, decrements m_cRef
to 0, executes the if
body (where this
is deleted), and returns NULL
.
When T1 is rescheduled, it will reference m_cref
on line 9. Thus it will access a member variable after the related this
pointer has been deleted—and when the heap for the object is in an unknown state.
ULONG CObject::Release()
{
if (0 == InterlockedDecrement(&m_cRef))
{
delete this;
return NULL;
}
/* this.m_cRef isn't thread safe */
return m_cRef;
}
The following code does not reference any heap memory after the object is deleted.
ULONG CObject::Release()
{
ASSERT(0 != m_cRef);
ULONG cRef = InterlockedDecrement(&m_cRef);
if (0 == cRef)
{
delete this;
return NULL;
}
return cRef;
}