2016-12-18 3 views
0

У меня есть программа, использующая STL для использования больших контейнеров чисел, иногда vector, иногда deque; иногда он строит большой vector напрямую, иногда он начинается с небольшого размера, а затем увеличивается с помощью resize.есть утечка памяти, когда STL выбрасывает исключение «bad_alloc»?

Конструктор vector или deque или resize иногда выбрасывает исключение «bad_alloc». Мой вопрос в том, есть ли утечка памяти здесь? Если утечки памяти нет, я все равно могу продолжить; но, если есть, все более хлопотно.

Моя система - 64-разрядная версия Windows 7, Visual Studio 2013 и работающая на 32-разрядных программах.

+0

FYI: http://stroustrup.com/except.pdf –

+0

@NickyC в чем ваш смысл? – athos

+0

@PaulRooney да, у него заканчивается память, но я предполагаю, что во время «конструктора» или «изменения размера» контейнеров STL используются 'new' или' malloc', поэтому, когда 'bad_alloc' выбрасывается из STL, STL очищает часть памяти? есть ли утечка памяти? – athos

ответ

1

Номер

Вброшенный std::bad_alloc исключение не означает, что существует утечка памяти. Это означает, что динамическое распределение с использованием оператора new или оператора new[] не выполнено.

по умолчанию, используемые распределители стандартных типов контейнеров (std::Vector, std::list и т.д.), как правило, используют оператор new или new[], поэтому также может бросить std::bad_alloc, если они терпят неудачу.

Утечка памяти является одной из возможных причин истощения памяти, и, в свою очередь, изнурение памяти является одной из возможных причин отказа динамически распределять память с использованием new или new[].

В общем, если выбрано std::bad_alloc, это означает, что попытка выделить память не удалась (и ее не нужно освобождать). Таким образом, утечки нет. Если какой-либо объект (или класс) плохо реализован, это может вызвать утечку памяти, если генерируется исключение. В стандарте описываются требования стандартных контейнеров, которые предотвращают это, предполагая, что элементы вектора также обеспечивают соответствующие гарантии.

+0

Непродуманный новый оператор может пропустить память. Представьте себе новый оператор, создавший запись журнала «новый» и «новый», второй вызов нового может завершиться неудачей, пропуская первый объект.Я признаю, что я думаю, что это не имеет отношения к ОП, но, возможно, полезно кому-то другому. –

+0

@ Zekian - Не так. Когда распределение не выполняется, выражение 'new' не требуется для выпуска объектов, которые ранее были успешно распределены. Это зависит от вызывающего, чтобы отслеживать эти объекты и освобождать их, используя соответствующее выражение 'delete'. – Peter

+0

Мое высказывание является предупреждением тем, кто выполняет индивидуальное внедрение нового. –

-1

std::bad_alloc бросается, когда new или new[] не выделяет память.

Возможно, у вас закончилась основная память? Возможно, вы попытались выделить особенно структуру new int[1024*1024*1024];? Ваша куча может стать фрагментированной (много распределений и удалений), поэтому не может быть выделено непрерывное пространство памяти того размера, который вы хотите.