Ошибка bad alloc nintendo switch
существует метод под названием foo это иногда возвращает следующую ошибку:
есть ли способ, что я могу использовать try - catch блок, чтобы остановить эту ошибку завершение моей программы (все, что я хочу сделать, это вернуться -1 )?
если да, то каков его синтаксис?
как еще я могу иметь дело с bad_alloc в C++?
вы можете поймать его, как и любое другое исключение:
то, что вы можете с пользой сделать с этого момента, зависит от вас, но это определенно возможно технически.
хуже того, современные операционные системы часто чрезмерно выделяют: malloc и new всегда будет возвращать допустимый указатель, даже если технически нет (или недостаточно) свободная память осталась-так std::bad_alloc никогда не будет выброшен, или, по крайней мере, не является надежным признаком истощения памяти. Вместо этого пытается открыть выделенная память приведет к ошибке, которая не может быть уловлена.
единственное, что вы могли бы сделать при ловле std::bad_alloc возможно, зарегистрировать ошибку и попытаться обеспечить безопасное завершение программы, освободив выдающиеся ресурсы (но это делается автоматически в обычном процессе размотки стека после получения ошибки бросается, если программа использует RAII соответствующим образом).
в некоторых случаях программа может попытаться освободить память и повторить попытку или использовать вторичную память (= диск) вместо ОЗУ, но эти возможности существуют только в очень конкретных сценариях.
каково стандартное поведение c++ new в c++?
обычно считается, что если new оператор не может выделить динамическую память запрошенного размера, тогда он должен выдать исключение типа std::bad_alloc .
Тем не менее, что-то еще происходит даже до bad_alloc исключение:
C++03 Раздел 3.7.4.1.3: говорит
функция распределения, которая не может выделить хранилище, может вызвать установленный в настоящее время new_handler(18.4.2.2), если таковой имеется. [Примечание: предоставленная программой функция распределения может получить адрес текущего установленного new_handler с помощью функции set_new_handler (18.4.2.3).] Если функция распределения, объявленная с пустой спецификацией исключения (15.4), throw (), не выделяет хранилище, она должна возвращать нулевой указатель. Любая другая функция распределения, которая не выделяет хранилище, должна указывать только на сбой, вызывая исключение класса std:: bad_alloc (18.4.2.1) или класс, производный от std::bad_alloc.
рассмотрим следующий пример кода:
как видно здесь по умолчанию new оператор когда неспособный выполнить запрос памяти, вызвать the new-handler функция повторно, пока она не сможет найти достаточно памяти или нет больше новых обработчиков. В приведенном выше примере, если мы называем std::abort() , outOfMemHandler() будет неоднократно звонил. Поэтому обработчик должен либо убедиться, что следующее распределение выполнено успешно, либо зарегистрировать другой обработчик, либо не зарегистрировать обработчик, либо не возвращать (т. е. завершить программу). Если нет нового обработчика и распределение завершается неудачно, оператор выдаст исключение.
что the new_handler и set_new_handler ?
new_handler является typedef для указателя на функцию, которая ничего не принимает и не возвращает, и set_new_handler - это функция, которая принимает и возвращает new_handler .
как обрабатывать из условий памяти в C++?
учитывая поведение new хорошо разработанная пользовательская программа должна обрабатывать условия из памяти, предоставляя правильный new_handler который делает одно из следующего:
сделать больше доступной памяти: это может позволить следующей попытке выделения памяти внутри цикла оператора new добиться успеха. Один из способов реализовать это-выделить большой блок памяти в программе запуск, затем отпустите его для использования в программе при первом вызове нового обработчика.
установите другой новый обработчик: если текущий новый обработчик не может сделать больше доступной памяти, и есть другой новый обработчик, который может, то текущий новый обработчик может установить другой новый обработчик на свое место (путем вызова set_new_handler ). В следующий раз, когда оператор new вызовет функцию new-handler, он получит самую последнюю установленную.
(A вариация на эту тему для нового обработчика, чтобы изменить свое собственное поведение, поэтому в следующий раз, когда он вызывается, он делает что-то другое. Один из способов добиться этого-заставить новый обработчик изменять статические, специфические для пространства имен или глобальные данные, влияющие на поведение нового обработчика.)
удалите новый обработчик: это делается путем передачи нулевого указателя на set_new_handler . Без установленного нового обработчика, operator new выдаст исключение ((конвертируемый в) std::bad_alloc ) когда памяти выделение не выполнено.
исключение кабриолет std::bad_alloc . Такие исключения не могут быть пойманы operator new , но будет распространяться на сайт, инициирующий запрос на память.
Но исключение не генерится никакое, кажется, что программа просто завершается при неудачной попытке new выделить память.
Прав ли я и как добиться генерации исключения при неудачной попытке выделить память?
Компилятор:
gcc --version
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
Выполнение программы выглядит так:
__________________Помощь в написании контрольных, курсовых и дипломных работ здесь
Какова причина исключения bad_alloc
При выделении памяти оператором new выскакивает исключение bad_alloc по какой причине оно может.
Генерация исключения в конструкторе
Добрый вечер! У меня возник вопрос с генерацией и перехватом исключений. Имеется код: class.
Генерация неконтролируемого исключения
С НГ, коллеги! Пришла мне в НГ такая идея, поддаться соблазну и сгенерировать неконтролируемое.
Генерация собственного исключения
Попытался кинуть исключение, не получилось. Хочу : Чтобы при вводе варианта (iNoVar) кроме 1го.
Выход за пределы.
Добавлено через 52 секунды
Как вариант:
Генерация исключения в конструкторе
Преподаватель попросил добавить в программу исключения, чтобы если в класс придут некорректный.
Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
При выполнении программы, которая миксует функции в которых создаются типовые задачи, вылезает.
Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
Есть задача: Написать программу, которая считывает текст из файла и выводит его на экран, заменив.
Ошибка terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc
Добрый день!Работаю с графами,и при больших значениях столкнулся с проблемой:ошибка в тесте.
I'm currently working on a project that depends on me providing a path to a file (eg. C:\Path.pth ). Now, I had everything working yesterday by calling my std::string with:
But now it doesn't work. It throws a bad_alloc . Seems like the ' \ ' character is the problem. I even tried using \x5C as the ascii-value of it instead, but same result.
Any help would be much appreciated
.. That sounds very likely. Or at least, it have to :P
Since no one have mentioned some kind of /SetStringCharSize:2bit-compiler option, I think it's safe to assume that my code has to mess something up, somewhere, and that it's not just a silly compiler-option (or similar) that's wrong..
7 Answers 7
As your error suggest, the problem is due to memory allocation (i.e. the bad_alloc exception).
So either you have no more memory (unlikely) or you have a buffer overrun somewhere before (quite likely in my opinion) or some other memory issues like double free.
In short, you do something that messes up the memory management layout (i.e. all these information in between allocated blocks). Check on what happens before this call.
39.2k 9 9 gold badges 43 43 silver badges 60 60 bronze badgesThe bug has been found and fixed.
Seems like TinyXML was has a bug when used with the TIXML_USE_STL definition. So for some reason the constructor to the TiDocument corrupted my memory-layout so badly that the next std::string I defined has to throw a bad_alloc exception - and luckily for me, exactly on the 4th char of the string, which in my situation was '\', resulting in a rather subtle error.
34 вызова этой функции работают нормально, и вызов
Я знаю, что трудно помочь без кода. Пожалуйста, просто попробуйте указать мне направление. Мои конкретные вопросы следующие:
Есть ли вероятность того, что у меня не хватает памяти стека, если я делаю всю программу через стек? Возможно ли мне загрузить некоторые из моих больших таблиц поиска (карты и т. Д.) В кучу, а затем просто использовать стек для моих итераций, где важна скорость?
Есть ли проблема с использованием изменения размера, связанного с памятью? Может ли это быть случай, когда я должен использовать «new» и «delete» (во многих случаях меня предупреждали не использовать их, если нет очень веской, конкретной причины для этого)?
34 срезах данных)
Любые мысли будут оценены. Я могу попытаться опубликовать некоторый код, но я уже пробовал это однажды, и все, казалось, были отвлечены тем фактом, что он не компилируется. Я могу опубликовать соответствующую функцию, но она сама не компилируется.
Вот класс, который вызывает проблему:
Кроме того, вот фрагмент из функции, где происходит рекурсия
Решение
bad_alloc возникает из-за проблем с кучей и может быть вызван любым кодом, который косвенно выделяет или освобождает кучу памяти, которая включает в себя все стандартные коллекции библиотек ( std::vector , std::map и т. д.), а также std::string ,
Если ваши программы не используют много памяти в куче (поэтому они не исчерпывают кучу), bad_alloc Скорее всего, они вызваны повреждением кучи, которое обычно вызывается использованием висячих указателей в куче.
Другие решения
Классы как std::vector а также std::string разрешено бросать bad_alloc или другие исключения. В конце концов, они должны использовать некоторую память, которая исходит откуда-то, и на любом компьютере достаточно памяти.
Операции-деструкторы, определенные в стандартной библиотеке C ++, не должны вызывать исключения. Каждый деструктор в стандартной библиотеке C ++ должен вести себя так, как если бы у него была спецификация без исключения. Любые другие функции, определенные в стандартной библиотеке C ++, которые не имеют Исключение-спецификация может генерировать определенные реализацией исключения, если не указано иное. [Сноска 1] Реализация может усилить это неявное Исключение-спецификация добавив явный.
Сноска 1: В частности, они могут сообщить об ошибке при выделении памяти, выдав исключение типа bad_alloc или класс, полученный из bad_alloc (18.6.2.1). Реализации библиотеки должны сообщать об ошибках, генерируя исключения или получаемые из стандартных классов исключений (18.6.2.1, 18.8, 19.2).
Если я не использую «new» и «delete», и все мои переменные инициализируются ВНУТРИ локальных функций, возможно ли возникновение проблем утечки / выделения памяти из-за повторных вызовов функций?
Неясно. Если все переменные, на которые вы ссылаетесь, являются локальными, нет. Если вы используете malloc (), calloc () и free (), да.
Есть ли вероятность того, что у меня не хватает памяти стека, если я делаю всю программу через стек?
Нет, если вы получите bad_alloc. Если вы получили ошибку «переполнение стека», да.
Возможно ли мне загрузить некоторые из моих больших таблиц поиска (карты и т. Д.) В кучу, а затем просто использовать стек для моих итераций, где важна скорость?
Что ж, трудно поверить, что вам нужна локальная копия таблицы поиска в каждом кадре стека рекурсивного метода.
Есть ли проблема с использованием изменения размера, связанного с памятью?
Конечно. Вы можете убежать.
Может ли это быть случай, когда я должен использовать «новый» и «удалить»
Сегодня невозможно, не зная больше о ваших структурах данных.
(Во многих случаях меня предупреждали не использовать их, если для этого нет очень веской, конкретной причины)?
Внутри проблемной функции я создаю переменную класса,
Вы создаете экземпляр класса в стеке. Я думаю. Просьба уточнить.
затем перезаписываю эту переменную около 20 раз (один раз для каждой «итерации» моей модели).
С заданием? Есть ли в классе оператор присваивания? Это правильно? Использует ли сам класс кучную память? Правильно ли он распределяется и удаляется при строительстве, разрушении и назначении?
Поскольку, как вы сказали, вы используете std::vector с распределителем по умолчанию, проблема возникает, когда вы используете много std::vector::resize(. ) и это происходит после нескольких итераций, я думаю, что вы столкнулись с проблемой фрагментации кучи.
Читайте также: