Domanda

// 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); }
};

Utilizzando il software Entrek Codesnitch per eseguire il debug e verificare eventuali perdite di memoria, ecc., viene segnalato il seguente errore:

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

Forse tutte le mie notti insonni mi stanno finalmente arrivando. Ma non capisco di cosa si stia esattamente lamentando. Qualche idea?

È stato utile?

Soluzione

Scommetto che puoi falsificare il boccino con :: memset (& amp; m_mutex, 0, sizeof (m_mutex)); prima della chiamata per iniziarlo.

Altri suggerimenti

Apparentemente CodeSnitch non è abbastanza intelligente da sapere che InitializeCriticalSection () si aspetta che stia funzionando su una struttura che contiene un puntatore non inizializzato.

Pensaci dal punto di vista di CodeSnitch. Qual è la differenza tra ciò che stai facendo e questo:

struct Customer {
    char * name;
};

extern void greetCustomer(Customer* c);

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

Questo sembra molto più sospetto per l'occhio umano , poiché deduciamo che greetCustomer probabilmente farà affidamento sull'inizializzazione di m_customer, cosa che ovviamente non lo è. Ma semanticamente, questo è esattamente lo stesso del tuo codice.

Probabilmente vale la pena presentare un bug con Entrek; InitializeCriticalSection () è una ragionevole eccezione alle strutture "dovrebbero essere inizializzate prima di passarle a una funzione" regola.

Non vedo nulla di sbagliato nella tua definizione della tua classe. Dove viene utilizzato però? Un'istanza particolare potrebbe ancora essere utilizzata in modo errato.

La definizione Win32 di una CRITICAL_SECTION include un puntatore a una 'struct _RTL_CRITICAL_SECTION *'. Il sistema operativo potrebbe essere intelligente nella gestione di questa struttura in modi che confondono lo strumento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top