Pergunta

// 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 o software Entrek Codesnitch para depurar e testar qualquer vazamentos de memória, etc., ele relata o seguinte erro:

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

Talvez todas as minhas noites sem dormir estão finalmente começando a me. Mas eu não entendo o que está exatamente reclamando. Alguma idéia?

Foi útil?

Solução

Eu aposto que você pode fingir fora o pomo com :: memset (& m_mutex, 0, sizeof (m_mutex)); antes da chamada para o init-lo.

Outras dicas

CodeSnitch aparentemente não é inteligente o suficiente para saber que InitializeCriticalSection () espera para estar trabalhando em uma estrutura que contém um ponteiro não inicializado.

Pense nisso a partir do ponto de vista de CodeSnitch. Qual é a diferença entre o que você está fazendo, e isto:

struct Customer {
    char * name;
};

extern void greetCustomer(Customer* c);

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

Isso parece muito mais peixe para o humana olho, porque nós inferir que greetCustomer é provavelmente vai contar com m_customer sendo inicializado, o que obviamente não é. Mas semanticamente, este exatamente o mesmo que o seu código.

É provavelmente vale a apresentação de um bug com Entrek; InitializeCriticalSection () é uma exceção razoável para as "estruturas deve ser inicializado antes de passá-los para uma função" regra.

Eu não vejo nada de errado com sua classe definição . Onde é que está sendo usado embora? Um caso particular ainda poderia ser usado de forma incorreta.

A definição Win32 de um CRITICAL_SECTION inclui um ponteiro para uma '_RTL_CRITICAL_SECTION struct *'. O OS pode ser ser inteligente em seu manuseio deste struct de maneiras que confundem a ferramenta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top