Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1

Нехватка памяти при выбросе исключения

06.08.2015, 09:56. Показов 4643. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно, наткнулся на проблему
C++
1
2
//Если здесь для создания std::string не хватит памяти, то вылетит std::bad_alloc, вместо std::runtime_error
     throw std::runtime_error ( "my runtime error" ) ;
искусственный пример: http://rextester.com/XVZL57047
Я, конечно, могу нагородить велосипеды, но может есть какие-то уже проверенные способы решения сие чуда?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.08.2015, 09:56
Ответы с готовыми решениями:

Нехватка памяти при чтении/записи файлов
Всем привет! Возникла проблема при работе программы, которая должна открывать текстовый файл, читать его, кодировать и записывать в...

Нехватка памяти при создании динамических объектов
Создаю 4 динамических объекта. 3 вектора и матрица. матрица - это результат перемножения двух векторов. третий вектор- это суммы...

Освобождение памяти при возникновения исключения в конструкторе
class IScene{ public : virtual void Draw() const = 0; } class Scene: public IScene { /.../ }

26
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 12:13
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Croessmah Посмотреть сообщение
выше я привел пример, что вместо std::out_of_range можно еще std::bad_alloc выхватить и не узнать о ошибке выхода за пределы.
фишка в том, что отказоустойчивый компонент должен ожидать и то, и другое, и третие.

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

потому что именно эту проблему придется порешать отказоустойчивому компоненту.

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

нужно решать конкретные проблемы по мере их поступления.

--------------------------------------------------------------------------------

если я правильно понял,
то std::bad_alloc был брошен именно из-за нехватки памяти для создания std::out_of_range ?
если я прав, значит ситуации, когда нельзя будет бросить исключение
из-за нехватки памяти действительно не может быть.
1
Эксперт по математике/физикеЭксперт С++
 Аватар для Ilot
2226 / 1428 / 420
Регистрация: 16.05.2013
Сообщений: 3,651
Записей в блоге: 6
06.08.2015, 12:16
Цитата Сообщение от Croessmah Посмотреть сообщение
Только нужное исключение создать не удается. Вот примерчик с cplusplus, внеденный в код с такой проблемой: http://rextester.com/IWCW30939
Croessmah, вы меня конечно простите я не хочу показаться дерзким, но я должен задать вопрос. При ошибке нехватки памяти вы снова наступаете на теже грабли, обращаясь к куче для построения временных объектов string. А отсюда вопрос вы вообще понимаете чего хотите и что вы делаете в этом примере?

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <stdexcept>
#include <string>
#include <vector>
 
const std::string first = "first";
const std::string second = "second";
 
// recursively print exception whats:
void print_what (const std::exception& e) {
  std::cerr << e.what() << '\n';
  try {
    std::rethrow_if_nested(e);
  } catch (const std::exception& nested) {
    std::cerr << "nested: ";
    print_what(nested);
  }
}
 
// throws an exception nested in another:
void throw_nested() {
  try {
    throw std::logic_error (first);
  } catch (const std::exception& e) {
    std::throw_with_nested(std::logic_error(second));
  }
}
 
int main()
{
    int * p ;
    std::vector<int> vec(10) ;
    try
    {
        try
        {
            while ( true )
                p =  new int [10000000] ;
        }
        catch ( const std::bad_alloc & fException )
        {
            std::cout << "1: " << fException.what() << std::endl ;
            try
            {
                while ( true )
                    p =  new int [10000] ;
            }
            catch ( const std::bad_alloc & sException )
            {
                std::cout << "2: " << sException.what() << std::endl ;
                try
                {
                    while ( true )
                        p =  new int [500] ;
                }
                catch ( const std::bad_alloc & tException )
                {
                    std::cout << "3: " << tException.what() << std::endl ;
                    try
                    {
                        while ( true )
                            p =  new int [1] ;
                    }
                    catch ( const std::bad_alloc & endException )
                    {
                        std::cout << "4: " << endException.what() << std::endl ;
                        try {
                            throw_nested();
                        }catch (std::exception& e) {
                            print_what(e);
                        }
                    }
                }
            }
        }
    }
    catch ( const std::exception & e )
    {
        std::cout << "end: " << e.what() << std::endl ;
    }
}
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
06.08.2015, 12:21  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
вот только тогда он на следущем заходе поймает std::out_of_range,
если он свершиться в этот раз. Ошибки имеют свойство прятаться
Цитата Сообщение от hoggy Посмотреть сообщение
и уже нет никакой разницы, был там выход за пределы или нет,
реальная причина сбоя - выход за пределы, и я могу бороться с нехваткой памяти сколько угодно, но рано или поздно ошибка выхода опять случится, на этот раз в самый не подходящий момент - при представлении готового продукта
Цитата Сообщение от hoggy Посмотреть сообщение
то std::bad_alloc был брошен именно из-за нехватки памяти для создания std::out_of_range ?
Ну, в принципе да, из-за того, что ему внутри тоже нужны данные.
Цитата Сообщение от hoggy Посмотреть сообщение
если я прав, значит ситуации, когда нельзя будет бросить исключение
из-за нехватки памяти действительно не может быть.
ну, с "легкими исключениями", типа bad_cast мне не удалось добиться такого.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.08.2015, 12:25
Цитата Сообщение от Croessmah Посмотреть сообщение
если он свершиться в этот раз. Ошибки имеют свойство прятаться
фигня. если он такой живучий, как нибудь отобъется.

Цитата Сообщение от Croessmah Посмотреть сообщение
реальная причина сбоя - выход за пределы, и я могу бороться с нехваткой памяти сколько угодно, но рано или поздно ошибка выхода опять случится
вот когда она случится, реально случится,
вот тогда и сработает ловушка out_of_range.
вот тогда компонент и будет решать эту проблему.

Цитата Сообщение от Croessmah Посмотреть сообщение
ну, с "легкими исключениями", типа bad_cast мне не удалось добиться такого.
не понял эту фразу.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
06.08.2015, 12:26  [ТС]
Цитата Сообщение от Ilot Посмотреть сообщение
При ошибке нехватки памяти вы снова наступаете на теже грабли, обращаясь к куче для построения временных объектов string.
см. Нехватка памяти при выбросе исключения
конструктор без string не спасает. STL тоже использует такие грабли.
Цитата Сообщение от Ilot Посмотреть сообщение
А отсюда вопрос вообще понимаете чего хотите и что вы делаете в этом примере?
В этом? Тупо забиваем память, а потом уже никакие "накопления" не спасут.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
06.08.2015, 13:42
Цитата Сообщение от Croessmah Посмотреть сообщение
только содержимое строчки придется менять, в зависимости от типа исключения, и получим тоже самое, плюс смотрите пример с vector::at
Просто заранее пните у этой строчки reserve(9000) и пока вам не потребуется более 9000 символов, строчка исключение нехватки памяти не выкинет.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
06.08.2015, 14:04
Лучший ответ Сообщение было отмечено Croessmah как решение

Решение

Croessmah, я как-то тоже решал подобную проблему и решил ее отказом от std::runtime_error и подобных. Вместо этого был свой класс, унаследованный от std::exception, в него помещался указатель на заранее выделенную область памяти (c thread local хранением), в которой и размещалась информация об ошибке.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.08.2015, 14:04

Освобождение памяти при исключениях и именованные исключения
Есть 2 вопроса, ответы чет не удалось загуглить 1)Каким образом выполняется освобождение памяти при возникновении исключительных ситуаций...

Создание исключения при динамическом выделении памяти
Вот код из учебника в нем мне все понятно. #include&lt;iostream&gt; #include&lt;cstdlib&gt; //exit() #include&lt;new&gt; using std::cout;using...

Нехватка памяти
Здравствуйте) пытаюсь выделить память под массив из 15345000 элементов, при запуске выскакивает окно &quot;прекращение работы&quot;. До...

Не освобождается память при выбросе исключений
это у меня находится в классе Add. Туда я добавляю элементы, перед этим проверяю, нет ли такого уже: try { ...

Стек. Нехватка памяти. Числа в тексте
Здравствуйте, у меня возникла проблема, и как я понял, именно в нехватке памяти. Программа должна выводить число и второе число, ближайшее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru