Что не так с этим крошечным кусочком мьютекса?

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 (& 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 *». Операционная система может быть умной в обработке этой структуры таким образом, чтобы сбить инструмент с толку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top