Что не так с этим крошечным кусочком мьютекса?
-
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 (& amp; m_mutex, 0, sizeof (m_mutex)); перед вызовом, чтобы инициировать его.
Другие советы
CodeSnitch явно недостаточно умен, чтобы понимать, что InitializeCriticalSection () ожидает, что будет работать над структурой, содержащей неинициализированный указатель.
Подумайте об этом с точки зрения CodeSnitch. В чем разница между тем, что вы делаете, и этим:
struct Customer {
char * name;
};
extern void greetCustomer(Customer* c);
class CheckoutLine {
private:
Customer m_customer;
public CheckoutLine() {
greetCustomer(&m_customer);
}
};
Это выглядит более подозрительно для глаз human , потому что мы делаем вывод, что greetCustomer, вероятно, будет полагаться на инициализацию m_customer, чего, очевидно, нет. Но семантически это точно так же, как ваш код.
Вероятно, стоит оставить ошибку в Entrek; InitializeCriticalSection () является разумным исключением из того, что «структуры должны быть инициализированы перед передачей их в функцию». Правило.
Я не вижу ничего плохого в вашем определении класса . Где это используется, хотя? Определенный экземпляр все еще может быть использован неправильно.
Определение CRITICAL_SECTION в Win32 содержит указатель на «struct _RTL_CRITICAL_SECTION *». Операционная система может быть умной в обработке этой структуры таким образом, чтобы сбить инструмент с толку.