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

これは、人間の目には、より怪しげに見えます。しかし、意味的には、これはあなたのコードとまったく同じです。

おそらく、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 *」へのポインターが含まれています。OSは、ツールを混乱させる方法でこの構造体を巧妙に処理している可能性があります。

于 2008-11-20T15:05:39.213 に答える