При использовании std ::vector::push_back для вставки неизвестного количества элементов, должен ли std::vector::max_size проверяться при каждом нажатии?

#c

#c

Вопрос:

Я использую std::vector в контексте, когда по одному вставляется некоторое неизвестное количество элементов. std::length_error выбрасывается, когда std::vector::reserve превышает максимальный размер, но, похоже, такой гарантии нет std::vector::push_back . Мой первый инстинкт — проверять, выполняется ли my_vector.size() == my_vector.max_size() при каждом нажатии, и выдавать исключение, если будет превышен максимум.

Если я не выполню такую проверку, возможно ли, что контейнер автоматически перейдет в недопустимое состояние? Например, может ли переполнение размера?

Спасибо!

Ответ №1:

Нет. push_back() будет выдан, если он не может выделить память.

max_size() является теоретическим пределом. Я никогда не видел, чтобы он использовался. Возможно, в контексте с крайне ограниченной памятью и без поддержки исключений это может быть полезно, но в целом нет.

Ответ №2:

std::vector сам по себе не генерирует исключение push_back , а Allocate::allocator генерирует исключение, когда вы превышаете максимальный предел.

Из https://en.cppreference.com/w/cpp/container/vector/push_back:

Если генерируется исключение (которое может быть вызвано Allocator::allocate() или конструктором копирования / перемещения элемента / присваивания), эта функция не имеет эффекта (строгая гарантия исключения).

Некоторые реализации также выдают std::length_error, когда push_back вызывает перераспределение, которое превысит max_size, из-за неявного вызова эквивалента reserve(size() 1) .

Ответ №3:

std::vector::max_size возвращать постоянное число. Как правило, это целое число размером 8 байт, размер вектора которого никогда не достигнет этого предела, если вы запустите свой код на обычной платформе, такой как ПК (поскольку значение целого числа размером 8 байт очень велико, оно намного больше, чем размер физической памяти вашего компьютера размер жесткого диска), поэтому my_vector.size() == my_vector.max_size() никогда не будет true . Как правило, вам не нужно беспокоиться о сообщении контейнера STL, он не может выделить достаточно памяти при запуске кода на обычном компьютере.

Только на некоторой встроенной платформе (с очень ограниченной памятью) значение std::vector::max_size может быть небольшим. Даже на такой платформе значение max_size все еще намного больше, чем физическая память, которую вы можете использовать. Вам нужно тщательно разработать свой код, который не позволит этому произойти, потому что, если это произойдет, вы ничего не сможете с этим поделать.

Представьте себе это:

 try {
// this logical must be done, if not, the business logical will fail
vector.push_back(data); 
}catch(const std::exceptionamp; e) {
// program will not terminated, but what fail is fail, codes wrote here can not repair the failure. 
// The only thing you can do is report the condition to user: "sorry, your request failed"
}
  

Помните, что когда контейнер STL не может выделить требуемую память, она не имеет отношения к фактическому размеру, превышающему максимальный размер. max_size описать только теоретическое ограничение, но это ограничение невозможно достичь.