この小さなミューテックスコードの何が問題になっていますか?
-
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は、この構造体をツールを混乱させるような方法で処理することで 巧妙である可能性があります。