Oharra
Baimena behar duzu orria atzitzeko. Direktorioetan saioa has dezakezu edo haiek alda ditzakezu.
Baimena behar duzu orria atzitzeko. Direktorioak alda ditzakezu.
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;
}