Оператор new
(или для POD, malloc/calloc) поддерживает простую и эффективную форму сбоя при распределении больших блоков памяти.
Скажем, у нас есть это:
const size_t sz = GetPotentiallyLargeBufferSize(); // 1M - 1000M
T* p = new (nothrow) T[sz];
if(!p) {
return sorry_not_enough_mem_would_you_like_to_try_again;
}
...
Есть ли такая конструкция для контейнеров std:: или мне всегда придется обрабатывать исключение (ожидаемое!!) с std::vector
и друзьями?
Может быть, есть способ написать пользовательский распределитель, который предварительно распределяет память, а затем передает этот пользовательский распределитель на вектор, так что до тех пор, пока вектор не запрашивает больше памяти, чем вы помещаете в распределитель заранее, это не подведет?
Последующая мысль: в действительности нужна была функция-член bool std::vector::reserve(std::nothrow) {...}
в дополнение к нормальной резервной функции. Но поскольку это имело бы смысл только в том случае, если распределители были расширены для того, чтобы допускать нечеткое распределение, этого просто не произойдет. Кажется, что (что-то новое) хорошо для чего-то в конце концов: -)
Изменить: Что касается того, почему я даже спрашиваю об этом:
Я думал об этом вопросе во время отладки (1 случайная/вторая случайная обработка исключений отладчика): Если я установил свой отладчик на 1-й шанс, поймаю любой bad_alloc, потому что я тестирую условия с низкой памятью, быть раздражающим, если он также поймал те исключения bad_alloc, которые уже хорошо ожидаются и обрабатываются в коде. Это не была/не очень большая проблема, но мне просто пришло в голову, что в проповеди говорится, что исключения для исключительных обстоятельств, и что-то, что я уже ожидаю, произойдет каждый нечетный вызов в коде, не является исключительным.
Если new (nothrow)
имеет законные цели использования, также будет иметь резерв vector-nothrow.