Как проверить, что изменение размера std :: vector получило соответствующую память - PullRequest
0 голосов
/ 12 ноября 2018

в коде

std::vector<int> vec(length);
vec.resize(2*length);
vec.push_back(4);
vec.reserve(3*length);

все операторы могут выдать исключение bad_alloc, если выделение n-раз length целых чисел завершится неудачно (см. Reserve и resize ).

Я вижу два подхода к обработке этого исключения

  • Используйте предложение try catch во всех случаях возможного выделения векторной памяти, чтобы перехватить исключение.
  • Перегрузка new и добавление обработки исключений для всех случаев.

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

Каков наилучший способ проверить, работает ли выделение памяти std::vector?

1 Ответ

0 голосов
/ 08 февраля 2019

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

На уровне программы : Добавьте пробную уловку в свой main, отобразите сообщение и выйдите.

На уровне модуля : Добавьте пробный улов вокруг точки входа DoStuffWhichRequiresALotOfMemory () вашего модуля. Убедитесь, что после того, как std :: bad_alloc брошен, ваша программа все еще находится в допустимом состоянии, f.i. модуль имеет отдельное состояние для остальной части программы или работает без побочных эффектов. Покажите сообщение, и все готово.

Обработка ошибок выделения памяти на таком низком уровне нецелесообразна. Если вам нужны эти гарантии, выделите всю память заранее (для всего модуля, а не только для вашего вектора) и используйте распределитель. Тогда у вас есть только одна точка, где он может потерпеть неудачу.

Я знаю, что это не дает прямого ответа на вопрос, но я призываю вас снова подумать о своей проблеме.

...