1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
|
||||||
1 | ||||||
Как предотвратить превышение размера массива?12.02.2017, 13:26. Показов 2006. Ответов 17
Метки нет (Все метки)
Вот программа(из следующей темы функции new, delete)
Добавлено через 8 минут Хочу понять почему так происходит, ведь по идее не должно такого быть! Покажите что как и где нужно изменить чтобы "превышения" не было. Заранее благодарен за помощь.
0
|
12.02.2017, 13:26 | |
Ответы с готовыми решениями:
17
Превышение размера стека От класса String наследовать новый класс, который имеет проверку на превышение размера строки Ассемблерная вставка: превышение размера операнда Превышение размера файла cookie допустимое контейнером |
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
|
|
12.02.2017, 13:32 | 2 |
Потому что компилятор не проверяет выход за границы массива. Но вы можете реализовать эту проверку в своём классе.
1
|
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
|
||||||
12.02.2017, 13:36 [ТС] | 3 | |||||
Я попытался это сделать следующим способом:
Подскажите, как можно реализовать проверку?
0
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
12.02.2017, 13:41 | 4 |
Потому что по стандарту это UB, а в случае UB компилятор имеет право делать что угодно, вплоть до начала восстания машин.
Это вопрос из серии "почему я перебегал улицу на красный свет, а машина меня не сбила?". Бегайте дальше, рано или поздно собьет.
1
|
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
|
||||||
12.02.2017, 13:41 | 5 | |||||
m_size и функцию size() , возвращающую значение этого поля.
1
|
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
|
|
12.02.2017, 13:44 | 6 |
strlen работает только на строках (и показывает не размер массива, а позицию первого '\0'). Стандартного способа вытрясти размер массива созданного через new нет, его надо ручками где-то захомячить.
1
|
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
|
||||||
12.02.2017, 13:48 [ТС] | 7 | |||||
likehood,
У меня вот что получилось но не до конца, как-то не получается дальше
0
|
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
|
||||||
12.02.2017, 13:52 | 8 | |||||
Сообщение было отмечено Maxim09 как решение
Решение
Функция size должна возвращать значение m_size, а не устанавливать:
1
|
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
|
|
12.02.2017, 13:55 [ТС] | 9 |
А где это можно установить? Я имею ввиду в private зоне? или непосредственно в конструкторе?
Это элемент класса так?
0
|
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
|
|
12.02.2017, 13:57 | 10 |
m_size - поле класса, в разделе private. Инициализируется в конструкторе.
1
|
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
|
||||||
12.02.2017, 14:06 [ТС] | 11 | |||||
В итоге вышло следующее:
Добавлено через 5 минут А как сделать m_size указателем?
0
|
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
|
|
12.02.2017, 14:09 | 12 |
0
|
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
|
|
12.02.2017, 14:11 [ТС] | 13 |
Ну чтоб не занимало место в памяти а сразу указывало на элемент.
Я попробовал вот так (size_t а также int)* m_size но компилятор стал ругаться.
0
|
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
|
|
12.02.2017, 14:14 | 14 |
Экономия на спичках?
Указатель тоже занимает место в памяти, скорее всего столько же, сколько переменная типа size_t.
1
|
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
|
|
12.02.2017, 14:15 [ТС] | 15 |
Понятно спс.
0
|
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
|
|
12.02.2017, 14:19 | 16 |
Тем более вместо экономии будет дополнительный расход памяти: на сам объект, и на указатель. Указатели используются вовсе не для экономии памяти.
0
|
1 / 1 / 4
Регистрация: 23.08.2015
Сообщений: 458
|
|
12.02.2017, 14:25 [ТС] | 17 |
А мне почему-то казалось что указатели используются если и не для экономии место то что-то близкое к этому кроме всех прочих свойств указателей
0
|
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
|
|
12.02.2017, 14:31 | 18 |
Возможно, имелось в виду, что указатели позволяют создать динамический массив, размер которого становится известным во время работы программы. В случае же использования статического массива мы вынуждены выделять память с запасом, в результате часть массива может оказаться неиспользуемой.
1
|
12.02.2017, 14:31 | |
12.02.2017, 14:31 | |
Помогаю со студенческими работами здесь
18
Превышение допустимого размера памяти в задаче (пилообразня последовательность) Как предотвратить выход за границу массива в матрице StringGrid работа с TStrings и исключение "превышение размера StringGrid" Как отследить превышение по току? Как обойти превышение длины пути? Дан целочисленный массив A размера N. Сформировать два новых целочисленных массива B и C одинакового размера, записав в Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |