Я использую std::vector
в контексте, когда некоторое неизвестное количество элементов вставляется по одному. std::length_error
генерируется, когда std::vector::reserve
превысит максимальный размер, но для std::vector::push_back
такой гарантии нет. Мой первый инстинкт — проверять, выполняется ли my_vector.size() == my_vector.max_size()
при каждом нажатии, и выдавать исключение, если максимум будет превышен.
Если я не сделаю такую проверку, возможно ли, что контейнер молча войдет в недопустимое состояние? Например, может ли размер переполниться?
Спасибо!
Нет. push_back()
выкинет, если не сможет выделить память.
max_size()
— теоретический предел. Я никогда не видел, чтобы это использовалось. Возможно, в контексте с крайне ограниченной памятью и отсутствием поддержки исключений это может быть полезно, но в целом нет.
std::vector
сам по себе не генерирует исключение для push_back
, а Allocate::allocator
выдает исключение, когда вы превышаете максимальный предел.
Из https://en.cppreference.com/w/cpp/container/vector/push_back:
If an exception is thrown (which can be due to Allocator::allocate() or element copy/move constructor/assignment), this function has no effect (strong exception guarantee).
...
Some implementations also throw std::length_error when push_back causes a reallocation that would exceed max_size, due to implicitly calling an equivalent of reserve(size()+1).
std::vector::max_size
вернуть постоянное число. Как правило, это размер 8 байт.
целое число, размер вектора которого никогда не достигнет этого предела, если вы запустите свой код на обычной платформе, такой как ПК (поскольку значение целого числа размером 8 байтов очень велико, оно намного больше, чем размер физической памяти вашей машины + размер жесткого диска ), поэтому my_vector.size() == my_vector.max_size()
никогда не будет правдой. Как правило, вам не нужно беспокоиться об отчете контейнера 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::exception& 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
описывают только теоретическое ограничение, но это ограничение невозможно достичь.