Pregunta

// A Mutex allows threads mutually exclusive access to a resource.
//-----------------------------------------------------------------------

class Mutex
{
private:
    CRITICAL_SECTION m_mutex;

public:
     Mutex() { InitializeCriticalSection(&m_mutex); }
    ~Mutex() { DeleteCriticalSection(&m_mutex);     }

    void acquire() { EnterCriticalSection(&m_mutex); }
    void release() { LeaveCriticalSection(&m_mutex); }
};

Usando el software Entrek Codesnitch para depurar y probar cualquier pérdida de memoria, etc., informa el siguiente error:

InitializeCriticalSection Error: lpCriticalSection (0x000387d4) points to an invalid 
  memory location (0x00018984) Mutex::Mutex in lockmutex.h, line 29

Quizás todas mis noches de insomnio finalmente me están afectando. Pero no entiendo de qué se está quejando exactamente. ¿Alguna idea?

¿Fue útil?

Solución

Apuesto a que puedes falsificar la snitch con :: memset (& amp; m_mutex, 0, sizeof (m_mutex)); antes de la llamada para iniciarlo.

Otros consejos

CodeSnitch aparentemente no es lo suficientemente inteligente como para saber que InitializeCriticalSection () espera trabajar en una estructura que contiene un puntero no inicializado.

Piense en ello desde el punto de vista de CodeSnitch. ¿Cuál es la diferencia entre lo que estás haciendo y esto?

struct Customer {
    char * name;
};

extern void greetCustomer(Customer* c);

class CheckoutLine {
  private:
    Customer m_customer;
  public CheckoutLine() {
    greetCustomer(&m_customer);
  }
};

Esto parece mucho más sospechoso para el ojo humano , porque inferimos que greetCustomer probablemente dependerá de la inicialización de m_customer, lo que obviamente no es así. Pero semánticamente, esto es exactamente lo mismo que su código.

Probablemente valga la pena presentar un error con Entrek; InitializeCriticalSection () es una excepción razonable a las estructuras "se debe inicializar antes de pasarlas a una función" regla.

No veo nada malo con la definición de clase de su clase. Sin embargo, ¿dónde se está utilizando? Una instancia en particular aún podría usarse incorrectamente.

La definición de Win32 de una CRITICAL_SECTION incluye un puntero a una 'struct _RTL_CRITICAL_SECTION *'. El sistema operativo podría ser inteligente en el manejo de esta estructura de manera que confunda la herramienta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top