Question

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

L’utilisation du logiciel Entrek Codesnitch pour déboguer et tester les fuites de mémoire, etc., indique l’erreur suivante:

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

Peut-être que toutes mes nuits blanches me touchent enfin. Mais je ne comprends pas de quoi il se plaint. Des idées?

Était-ce utile?

La solution

Je parie que vous pouvez simuler le mouchard avec :: memset (& m_mutex, 0, sizeof (m_mutex)); avant l'appel à l'init.

Autres conseils

CodeSnitch n’est apparemment pas assez intelligent pour savoir que InitializeCriticalSection () s'attend à ce que travaille sur une structure contenant un pointeur non initialisé.

Pensez-y du point de vue de CodeSnitch. Quelle est la différence entre ce que vous faites et ceci:

struct Customer {
    char * name;
};

extern void greetCustomer(Customer* c);

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

Cela semble beaucoup plus risqué pour l'œil humain , car nous en déduisons que greetCustomer va probablement compter sur l'initialisation de m_customer, ce qui n'est évidemment pas le cas. Mais sémantiquement, cela correspond exactement à votre code.

Cela vaut probablement la peine de déposer un bogue avec Entrek; InitializeCriticalSection () est une exception raisonnable aux "structures devant être initialisées avant de les transmettre à une fonction". règle.

Je ne vois rien de mal avec votre définition de votre classe. Où est-il utilisé cependant? Une instance particulière peut toujours être utilisée de manière incorrecte.

La définition Win32 d’une CRITICAL_SECTION inclut un pointeur sur une 'struct _RTL_CRITICAL_SECTION *'. Le système d'exploitation pourrait être astucieux dans sa gestion de cette structure de manière à rendre l’outil confus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top