Согласно документация объект критической секции нельзя копировать или перемещать.
Означает ли это, что его нельзя безопасно хранить в коллекции стилей std::vector как экземпляр?
звучит похоже на std::mutex (не копируемый и не перемещаемый), а ответ здесь означает, что да, вы могу, но вы не можете сделать ничего, что потенциально могло бы изменить размер вектора (это означает, что вы можете построить его только с фиксированным размером)
кроме того, unique_ptr может быть вариантом для безопасного хранения ссылок на них внутри std::vector
однако структуры Windows API обычно просто объявляются как POD, что означает, что вы не получите ошибку компилятора, если попытаетесь скопировать или переместить ее:/
@BradAllred это часть C API
я сначала спрашиваю - какой смысл вообще хранить это в std::vector ?





Правильный; объект CRITICAL_SECTION не следует копировать/перемещать, так как он может перестать работать (например, возможно, он содержит указатели на себя).
Одним из подходов было бы сохранение вектора интеллектуальных указателей, например. (код С++ 17):
#include <windows.h>
#include <memory>
#include <vector>
using CS_ptr = std::unique_ptr<CRITICAL_SECTION, decltype(&DeleteCriticalSection)>;
CS_ptr make_CriticalSection(void)
{
CS_ptr p(new CRITICAL_SECTION, DeleteCriticalSection);
InitializeCriticalSection(p.get());
return p;
}
int main()
{
std::vector<CS_ptr> vec;
vec.push_back( make_CriticalSection() );
}
Рассмотрите возможность использования std::recursive_mutex, который является заменой CRITICAL SECTION (и, вероятно, просто обертывает его в реализации Windows) и выполняет правильную инициализацию и выпуск в своем деструкторе.
Стандартные мьютексы также нельзя копировать, поэтому в этом случае вы должны использовать std::unique_ptr<std::recursive_mutex>, если вам нужен их вектор.
Как обсуждалось здесь также подумайте, действительно ли вам нужен std::mutex вместо рекурсивного мьютекса.
ПРИМЕЧАНИЕ. Windows Mutex является межпроцессным объектом; std::mutex и друзья соответствуют CRITICAL_SECTION.
Я бы также предложил пересмотреть необходимость вектора мьютексов; может быть лучшее решение для того, что вы пытаетесь сделать.
Я предполагаю, что это не класс С++? если бы это было так, то его копирование/перемещение должно быть явно удалено.