この小さなミューテックスコードの何が問題になっていますか?

StackOverflow https://stackoverflow.com/questions/305536

  •  08-07-2019
  •  | 
  •  

質問

// 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

たぶん、眠れぬ夜がついにやって来たのかもしれません。しかし、私はそれが正確に不満を言っているものを理解していません。アイデアはありますか?

役に立ちましたか?

解決

:: memset(& m_mutex、0、sizeof(m_mutex));でスニッチを偽造できると確信していますinitを呼び出す前。

他のヒント

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()は、「構造体を関数に渡す前に初期化する必要がある」ことに対する合理的な例外です。ルール。

クラスの定義に問題はありません。それはどこで使用されていますか?それでも、特定のインスタンスが誤って使用される可能性があります。

CRITICAL_SECTIONのWin32定義には、 'struct _RTL_CRITICAL_SECTION *'へのポインターが含まれています。 OSは、この構造体をツールを混乱させるような方法で処理することで 巧妙である可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top