Я вижу, вы объявили пустой конструктор копирования:
SharedVector(const SharedVector& rhs) {}
Как я уверен, вы знаете, что эта функция ничего не делает, и она также не инициализирует cs
. Поскольку ваш класс содержит экземпляр CRITICAL_SECTION
, вы должны обязательно запретить вызовы конструктора копирования и вызовов операторов присваивания, если только вы не собираетесь полностью их реализовать. Вы можете сделать это, разместив следующие объявления в разделе private
вашего класса:
SharedVector(const SharedVector &);
SharedVector &operator=(const SharedVector &);
Это не позволяет компилятору автоматически генерировать неправильные версии этих методов, а также не позволяет вам вызывать их в другом коде, который вы пишете (потому что это только объявления, но не определения с {}
блоками кода).
Кроме того, как упоминал Арно , конструктор, принимающий аргумент CRITICAL_SECTION&
, кажется неправильным. Ваша реализация выполняет копирование переданного критического раздела в cs
(что недопустимо для CRITICAL_SECTION
), затем вызывает InitializeCriticalSection(&cs)
, который перезаписывает только что сделанную копию и создает новый критический раздел. Для вызывающего абонента, который прошел в критической секции, это, кажется, делает неправильную вещь, фактически игнорируя все, что было передано.