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

使用Entrek Codesnitch软件调试和测试是否有内存泄漏等,报如下错误:

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

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

4

3 回答 3

6

CodeSnitch 显然不够聪明,无法知道 InitializeCriticalSection()期望在包含未初始化指针的结构上工作。

从 CodeSnitch 的角度来考虑。你在做什么和这个有什么区别:

struct Customer {
    char * name;
};

extern void greetCustomer(Customer* c);

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

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

可能值得向 Entrek 提交错误;InitializeCriticalSection() 是“结构应在将其传递给函数之前进行初始化”规则的合理例外。

于 2008-11-20T15:41:34.180 回答
4

我敢打赌你可以用 ::memset ( & m_mutex, 0, sizeof ( m_mutex ) ) 伪造告密者;在调用它之前调用它。

于 2008-11-20T15:45:43.390 回答
0

我看不出你的类定义有什么问题。但是它在哪里使用?一个特定的实例仍然可能被错误地使用。

CRITICAL_SECTION 的 Win32 定义包括指向“struct _RTL_CRITICAL_SECTION *”的指针。操作系统可能会以使工具混淆的方式巧妙地处理此结构。

于 2008-11-20T15:05:39.213 回答