Проверка на плохое распределение при инициализации вектора - PullRequest
0 голосов
/ 03 мая 2018

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

например, что-то подобное вообще необходимо?:

   try {
       std::vector<T> map;
       map.pushback(t);
    } catch (const std::bad_alloc& e) {
        std::cout << "Allocation failed: " << e.what() << '\n';
    }

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Сценарий, в котором вы получите std::bad_alloc, в большинстве случаев является сценарием, в котором вы пытались выделить слишком много памяти, и системе нечего дать. В большинстве случаев это не исправимая ошибка. Возможно, имеет смысл обернуть всю программу в блок try-catch, чтобы, возможно, выдать сообщение об ошибке ("System ran out of memory!"), но в большинстве случаев не стоит перехватывать эту ошибку, потому что не будет разумного варианта восстановления для вашего программа.

Но обратите внимание, что я хеджирую свой язык здесь. Все зависит от того, какое приложение вы используете. Например, если вы пишете программу, которая адаптируется в зависимости от того, сколько памяти доступно (может быть, она пытается выделить 64 ГБ памяти, но если нет, то вместо этого она просто записывает / читает временные файлы?) может быть логично обернуть выделение, подобное этому, в блок try-catch и добавить логику для сценария, в котором происходит сбой выделения памяти.

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

0 голосов
/ 03 мая 2018

например, что-то подобное даже необходимо?:

Как указано в документации

Если выдается исключение (которое может быть связано с Allocator :: allocate () или конструктором / назначением копирования / перемещения элемента), эта функция не действует (гарантия сильного исключения).

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

0 голосов
/ 03 мая 2018

Поскольку я прочитал, что каждый элемент вектора создается в куче

std::vector владеет выделенным кучей непрерывным буфером. Элементы добавляются в буфер. Каждый элемент не выделяется отдельно.

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


например, что-то подобное вообще необходимо?

Вероятно, это излишне, если только вы не ожидаете, что push_back по какой-то причине потребляет всю доступную память. Обработка std::bad_alloc может быть полезна в некоторых сценариях, но большую часть времени нехватка памяти не требуется для восстановления - это полностью зависит от типа программы, над которой вы работаете.

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

...