Класс bad_alloc
Данный класс описывает исключение, возникновение которого указывает на то, что запрос на выделение памяти не выполнен.
Синтаксис
class bad_alloc : public exception < bad_alloc(); virtual ~bad_alloc(); bad_alloc(const bad_alloc&); bad_alloc& operator=(const bad_alloc&); const char* what() const override; >;
Замечания
Возвращаемое what значением является строка C, определяемая реализацией. Ни одна из функций-членов не создает исключение.
Пример
// bad_alloc.cpp // compile with: /EHsc #include #include using namespace std; int main() < char* ptr; try < ptr = new char[(~unsigned int((int)0)/2) - 1]; delete[] ptr; >catch( bad_alloc &ba) < cout >
bad allocation
В чем причина возникновения ошибки std::bad_alloc при поиске в графе?
Значения вершин и ребер программа читает из файла in.txt.В него в первую строку записывается число вершин и ребер, в остальные — пути. Далее представленный пример — это граф с 4 вершинами и 4 ребрами с путями 0 — 1 — 2 — 3 — 4
4 4
0 1
1 2
2 3
3 4
Программа работает исправно до того момента, пока число ребер не превышает значение 24000, после чего возникает ошибка
Unhandled exception at 0x76A7A6E2 in deep.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x008FFA74.
В одном из тестов программа должна работать с количеством вершин, равным 1000000, что значительно больше, чем 24000. Исправима ли данная ошибка?
- Вопрос задан более двух лет назад
- 136 просмотров
Непонятный bad_alloc?

А может быть проблема в том, что ты в качестве индекса используешь тип со знаком? Попробуй у i указать тип std::size_t . И кстати, что за компилятор?
rumgot ★★★★★
( 01.05.21 14:55:36 MSK )
Последнее исправление: rumgot 01.05.21 14:59:31 MSK (всего исправлений: 1)

Скорее всего, где-то раньше повредилась память. valgrind или санитайзеры в помощь.
xaizek ★★★★★
( 01.05.21 15:05:48 MSK )

решено переводом режим в рели3 и подключением рели3ных библиотек
bad_master ★
( 01.05.21 15:58:08 MSK ) автор топика
Ответ на: комментарий от bad_master 01.05.21 15:58:08 MSK
Это не очень решение. Нужно разобраться.
Std bad alloc что это
Всем привет.
Возникла такая проблема.
Есть приложение которое открывает файлы, процессит их, и закрывает.
Так вот в ходе процессинга переодически возникает исключение bad_alloc
которое местами можно перехватить а местами (внутри библиотеки QT) неззя.
Исключение рандомное — на рандомных файлах бывает редко но бывает.
В том числе происходит при попытке создать обыкновенный класс без внутренних наворотов.
Собственно вопрос — что может быть причиной того что валидные операторы new вызывают std::bad_alloc ?
Дополнительная информация:
1) в приложении используются сторонние библиотеки которые не исключено могут портить память
но вот я не очень пойму что такого должно быть испорчено в памяти чтобы апликуха вылетала с невозможностью выделить память.
2) библиотека которая может портить память использует CRT 5-й версии (линукс) а сама апликуха 6-ю
3) если скипать эти бедаллоки — то все работает нормально
4) аппликуха отжирает всего 200 метров памяти из 3х гигабайт
5) иногда так же само падает QT — но тут уже не перехватишь исключение.
Re: Блуждающий std::bad_alloc
| От: | nen777w |
| Дата: | 15.06.11 14:37 |
| Оценка: |
ИМХО тут дебагером только смотреть надо.
Может быть всё угодно от фрагментации памяти, неправильного размера выделяемой памяти (например переполнение где то или что то такое), до кривого самопального алокатора (если такой используется).
Re[2]: Блуждающий std::bad_alloc
| От: | Dez |
| Дата: | 15.06.11 14:41 |
| Оценка: |
Здравствуйте, nen777w, Вы писали:
N>ИМХО тут дебагером только смотреть надо.
N>Может быть всё угодно от фрагментации памяти, неправильного размера выделяемой памяти (например переполнение где то или что то такое), до кривого самопального алокатора (если такой используется).
вот дебагером то не посмотришь.
так как эксепшин после 15-ти минут работы в среднем
и когда он отлавливается — то встек то уже раскручен.
ставить бряку на все экспешины бесполезно так как используется модель возврата ошибки по экспешину а не по коду возврата.
кастомные мемори аллокаторы не юзаются.
Re: Блуждающий std::bad_alloc
| От: | nen777w |
| Дата: | 15.06.11 14:43 |
| Оценка: |
кстати вот вариант когда кучу смешали с г-ном
2) библиотека которая может портить память использует CRT 5-й версии (линукс) а сама апликуха 6-ю
недавно боролся с подобным. только там рушилось сразу (под дебагом конечно это было видно). Выделяли память в одной CRT а освобождали в другой.
Re[3]: Блуждающий std::bad_alloc
| От: | nen777w |
| Дата: | 15.06.11 14:48 |
| Оценка: |
Dez>ставить бряку на все экспешины бесполезно так как используется модель возврата ошибки по экспешину а не по коду возврата.
А зачем на все эксепшены. Если в студии работаете то в Debug->Exceptions. C++Exceptions->std::exception
Или ваши исключение тоже от std::exception унаследованы?
Re[4]: Блуждающий std::bad_alloc
| От: | Dez |
| Дата: | 15.06.11 14:51 |
| Оценка: |
Здравствуйте, nen777w, Вы писали:
Dez>>ставить бряку на все экспешины бесполезно так как используется модель возврата ошибки по экспешину а не по коду возврата.
N>А зачем на все эксепшены. Если в студии работаете то в Debug->Exceptions. C++Exceptions->std::exception
N>Или ваши исключение тоже от std::exception унаследованы?
бага повторяется только под линуксом
а там только бряка на все эксепшины — или я не прав ?
Re: Блуждающий std::bad_alloc
| От: | uzhas | |
| Дата: | 15.06.11 16:36 | |
| Оценка: | 1 (1) | |
Здравствуйте, Dez, Вы писали:
Dez>Собственно вопрос — что может быть причиной того что валидные операторы new вызывают std::bad_alloc ?
например, выделение слишком больших кусков памяти (>4 гигабайта). бывает при использовании неинициализированных переменных
рекомендации:
1) проверить crash dump
2) использовать valgrind
3) проверить (r)limits
Re[2]: Блуждающий std::bad_alloc
| От: | rm822 |
| Дата: | 15.06.11 18:06 |
| Оценка: |
Типичный баг, по крайней мере под виндой
чтобы вылетел бэдаллок не нужно портить память, или отжирать ее. Вполне достаточно в 2ГБ адресное пространство загрузить 50 дллек, которые порубят его на непрерывные куски по 40мб +-
Re[3]: Блуждающий std::bad_alloc
| От: | chemey |
| Дата: | 17.06.11 10:55 |
| Оценка: |
Здравствуйте, Dez, Вы писали:
Dez>вот дебагером то не посмотришь.
Dez>так как эксепшин после 15-ти минут работы в среднем
Dez>и когда он отлавливается — то встек то уже раскручен.
Дык не перехватывай его вообще нигде.
В результате твое приложение завершится аварийно, при этом стек раскручен не будет.
Можно будет посмотреть бэктрейс.
Бзззззззжжжжж
Re[3]: Блуждающий std::bad_alloc
| От: | Dez |
| Дата: | 17.06.11 19:46 |
| Оценка: |
Здравствуйте, rm822, Вы писали:
R>Типичный баг, по крайней мере под виндой
R>чтобы вылетел бэдаллок не нужно портить память, или отжирать ее. Вполне достаточно в 2ГБ адресное пространство загрузить 50 дллек, которые порубят его на непрерывные куски по 40мб +-
Ваш ответ подтолкнул к поиску ошибки.
Оказалось что в программе есть утечки памяти (около 100-200 МБ) в принципе не критичных, но их много и судя по всему они сильно фрагментировали память что собственно иногда не позволяло выделить цельный блок нужного размера.
Полечив утечки вылечились и креши.
Re[5]: Блуждающий std::bad_alloc
| От: | Peregrin |
| Дата: | 18.06.11 13:42 |
| Оценка: |
Здравствуйте, Dez, Вы писали:
Dez>бага повторяется только под линуксом
Dez>а там только бряка на все эксепшины — или я не прав ?