Re[6]: Обработка ошибок в деструкторе своего умного указател
От: qaz77  
Дата: 26.12.22 08:30
Оценка:
Здравствуйте, Kernan, Вы писали:

Q>>Как раз bad_alloc не показатель, что памяти нет и все караул.

Q>>Если запросить большой непрерывный блок, то из-за фрагментации адресного пространства можно получить bad_alloc и при наличии свободных гигабайтов.
K>Ты такое встречал хоть раз не на велосипедных аллокаторах которые не умеют такое обрабатывать?

Конечно, встречал.
std::vector<int> v(10000000, 0);

После того как программа поработала какое-то время, что-то повыделяла туда-сюда, конструктор вектора вполне может бросить bad_alloc.

Q>>Просто не нашлось непрерывного куска в 200 мб...

K>Отлично, отлично... а теперь придумай что в этом случае делать? Вот надо что-то сделать же, да? Вот напиши 3 вариант кроме падения с терминейтом.

Если программа может взаимодействовать с пользователем, например через GUI, то можно сказать что-то типа "недостаточно памяти для выполнения операции",
"попробуйте задать более узкий фильтр для обработки данных" и т.п.
В целом, ситуация аналогична "недостаточно места на диске".

Сама то программа остается в рабочем состоянии, нет места только для больших непрерывных кусков памяти.
Через какое-то время может и они появятся.

А может просто пользователь начудил и задал какие-то огромные значения входных параметров, программа ему говорит "не шмогла", а он такой — ну и ладно, задам параметры поменьше.

Непонятно, зачем именно bad_alloc так демонизировать, что сразу в терминейт...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.