Класс 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»
Функция res() должна на вход принимать указатель на строку и возращать вектор с типом строки с размером длины передаваемой строки, а каждый элемент в векторе должен соответственно равен каждому символу строки. Проблема: При запуске программа выдаёт следующую ошибку: terminate called after throwing an instance of ‘std::bad_alloc’ what(): std::bad_alloc
#include #include #include #include using namespace std; vector res(string *p) < vectorvres; vres.reserve(p->size()); for (int i = 0; i < p->size();++i) < vres.push_back(p[i]); >return vres; > int main(int argc, char* argv[]) < string word = "Hello"; string * pword = &word; vectorresult = res(pword); copy(result.begin(), result.end(), ostream_iterator(cout, " ")); return 0; >
Отслеживать
219k 15 15 золотых знаков 119 119 серебряных знаков 230 230 бронзовых знаков
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>а там только бряка на все эксепшины — или я не прав ?
unixforum.org
Доброго времени суток!
Есть несколько проектов на Qt, вроде как рабочих, но иногда ведущих себя странно.
Если запускать отладочную версию проекта, то всё хорошо.
А вот если релизную, то программа падает и в консоль сыпется
terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
Если сразу после такого, не меняя ничего, переключить сборку на debug, собрать и запустить — всё работает. После тут же переключаешься на release, пересобираешь, запускаешь — падает.
Как вообще такое можно отловить?
Последний раз редактировалось devilr 31.07.2020 14:48, всего редактировалось 1 раз.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20642 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: Странная ошибка
Сообщение Bizdelnick » 31.07.2020 00:57
Что значит «debug» или «release» сборка? На уровне флагов компилятора. Попробуйте подобрать такие флаги, с которыми ошибка будет воспроизводиться, но отладка останется возможной. Например, если debug — это -g -Og , а release — это -O2 , попробуйте -g -O2 .
Добавлено (01:02):
Ещё попробуйте дебажную сборку с ubsan ( -fsanitize=undefined ). Он может отловить ошибку и без падения.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |