这一小块互斥代码有什么问题?

Seb*_*nik 2 c++ mutex critical-section

// 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); }
};
Run Code Online (Sandbox Code Playgroud)

使用Entrek Codesnitch软件调试和测试任何内存泄漏等,它报告以下错误:

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

也许我所有不眠之夜终于到了我的身边.但我不明白它究竟在抱怨什么.有任何想法吗?

Tim*_*her 6

CodeSnitch显然不够聪明,不知道InitializeCriticalSection()期望处理包含未初始化指针的结构.

从CodeSnitch的角度来看它.你正在做什么和这之间有什么区别:

struct Customer {
    char * name;
};

extern void greetCustomer(Customer* c);

class CheckoutLine {
  private:
    Customer m_customer;
  public CheckoutLine() {
    greetCustomer(&m_customer);
  }
};
Run Code Online (Sandbox Code Playgroud)

这看起来对眼更加腥,因为我们推断greetCustomer可能会依赖于m_customer被初始化,这显然不是.但从语义上讲,这与您的代码完全相同.

可能值得向Entrek提交一个错误; InitializeCriticalSection()是"结构应该在传递给函数之前初始化"规则的合理例外.