Теоретически, если push_back
выбрасывает, память не выделяется самим контейнером.
Если вы выделяете память самостоятельно, вы должны заключить ваши выделения в умные указатели, чтобы они безопасно высвободились в этом дело. Это означает, что вместо этого:
v.push_back(new Obj{});
имеет это:
v.push_back(std::make_unique<Obj>())
Итак, если у вас есть некоторый верхний уровень обработки исключения std::bad_alloc
(или любого std::exception
), вы может восстановиться без утечек памяти, и вам не нужно переносить каждое выделение с помощью try
/ catch
.
На практике многие программы не обрабатывают ошибки выделения памяти должным образом, особенно для небольшие выделения. Требуется слишком много усилий, чтобы все это сделать правильно
И в некоторых случаях вы даже не получаете bad_allo c при выделении, вы просто получаете ошибку на странице при попытке использовать эту память.