Share via


Advertencia C28616

Condición de AV multiproceso

Esta advertencia indica que un subproceso puede tener acceso a objetos eliminados si se adelantó.

Comentarios

No debe haber acceso a un objeto con recuento de referencias después de que el recuento de referencias sea cero.

Nombre del análisis de código: INTERLOCKEDDECREMENT_MISUSE1

Ejemplo

El código siguiente genera esta advertencia. Este es un ejemplo de secuencia de tiempo de subproceso que podría exponer este problema. En este ejemplo, m_cRef es miembro de this:

Un subproceso T1 ejecuta la if condición, disminuye en m_cRef 1 y, a continuación, se adelanta.

Otro subproceso T2 ejecuta la if condición, disminuye en m_cRef 0, ejecuta el if cuerpo (donde this se elimina) y devuelve NULL.

Cuando se vuelva a programar T1, hará referencia m_cref a la línea 9. Por lo tanto, tendrá acceso a una variable miembro después de eliminar el puntero relacionado this y cuando el montón del objeto esté en un estado desconocido.

ULONG CObject::Release()
{
    if (0 == InterlockedDecrement(&m_cRef))
    {
        delete this;
        return NULL;
    }
    /* this.m_cRef isn't thread safe */
    return m_cRef;
}

El código siguiente no hace referencia a ninguna memoria del montón después de eliminar el objeto.

ULONG CObject::Release()
{
    ASSERT(0 != m_cRef);
    ULONG cRef = InterlockedDecrement(&m_cRef);
    if (0 == cRef)
    {
        delete this;
        return NULL;
    }
    return cRef;
}