Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Fixer_84
1038 / 653 / 648
Регистрация: 30.04.2016
Сообщений: 2,208
#1

Обработка исключений. Максимальный размер массива

03.07.2018, 19:57. Просмотров 62. Ответов 1
Метки нет (Все метки)

Здравствуйте! Столкнулся со следующей проблемой. Если задаю размер массива как константу большую, чем тип данных массива, то исключение отлавливается:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream> 
#include <new>
 
    using namespace std;
 
int main() {
    try {
        int* arr = new int[INT_MAX + 1];
    } catch (bad_alloc& e) {
        cerr << "Array size out of range! Error => " << e.what() << "\n"; //Если исключение поймано
        return 0;
    }
    cout << "OK!\n"; //Если исключение не поймано
    system("pause");
    return 0;
}
Но для заданного n (когда n больше INT_MAX) исключение не отловить, так как n автоматически приводится к INT_MAX:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream> 
#include <new>
 
    using namespace std;
 
int main() {
    try {
        int n;
        cin >> n; //Здесь число большее INT_MAX
        int* arr = new int[n];
    } catch (bad_alloc& e) {
        cerr << "Array size out of range! Error => " << e.what() << "\n"; //Если исключение поймано
        return 0;
    }
    cout << "OK!\n"; //Если исключение не поймано
    system("pause");
    return 0;
}
Как отловить такое исключение? Варианты типа сделать n long long я уже рассматривал, так он не подходит по причине того, что тип самого массива тоже может быть long long. Может быть, кто-то сталкивался с такой ситуацией...Что обычно делается в таких случаях?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2018, 19:57
Ответы с готовыми решениями:

Обработка исключений с пмощью структурированной обработки исключений
Есть функция, которая определенным образом работает с файлами,но при работе с файлами &quot;не...

Максимальный размер массива
Допустим,массив на 1000,но ввели только 10,можно как-то выделить только заполненные места...

Максимальный размер массива, vector, set, map
Как можно узнать максимальный размер массива, vector, set, map, стеков, очередей. Это зависит от...

Какой максимальный размер двумерного массива можно создать?
Ребят возник вопрос. Самый большой тип знаковый- это __int64. Там максимальный элемент равен:9 223...

Можно ли обойти ограничение на максимальный размер массива ? error C2148: total size of array must not exceed 0x7fffffff bytes
Ну собственно Visual Studio 2012, платформа x64, при попытке создать массив из 10-и миллиардов...

1
Croessmah
++Ͻ
14488 / 8269 / 1553
Регистрация: 27.09.2012
Сообщений: 20,312
Записей в блоге: 3
Завершенные тесты: 1
03.07.2018, 20:15 #2
n типа int, поэтому не может быть больше INT_MAX, ну вот вообще никак.
INT_MAX + 1 - получили переполнение, вполне вероятно INT_MIN, равный 0xFFFFFFFF (при четырехбайтном int'е и восьми битном байте).
new-expression ждет беззнаковое число. Знаковый int легко преобразуется в беззнаковое значение, посему получается не малое беззнаковое число 0xFFFFFFFF.

А еще предупреждения компилятора почитать следует:
http://rextester.com/WZHV44109
warning: integer overflow in expression [-Woverflow]
int* arr = new int[INT_MAX + 1];
Можно использовать беззнаковый литерал, чтобы всё выражение было беззнаковым, тогда к INT_MAX получится прибавить единицу:
C++
1
int* arr = new int[INT_MAX + 1u];//Суффикс u говорит что единица имеет тип unsigned int, и все вычисления будут в беззнаковом варианте

C++
1
cin >> n; //Здесь число большее INT_MAX
n типа int, поэтому не может быть больше INT_MAX, ну вот вообще никак.
Оно тупо не залезет в n.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2018, 20:15

Обработка исключений
Уважаемые админы. Знаю, что о помощи надо просить, когда имеются хоть какие-то наработки. К...

Обработка исключений
В задании функции должны генерировать подходящие исключения. Обработку исключений нужно выполнять...

Обработка исключений
Все функции должны реализоваться в 4-х вариантах: без спецификации исключений; со спецификацией...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru