3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
|
||||||
1 | ||||||
Выход за пределы массива при использовании оператора new20.07.2011, 17:01. Показов 2001. Ответов 18
Метки нет (Все метки)
0
|
20.07.2011, 17:01 | |
Ответы с готовыми решениями:
18
Выход за пределы массива при инициализации потока Выход за пределы массива при очистке памяти Выход за пределы массива при его сортировке Выход за пределы массива при сортировке подсчетом |
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
|
|
20.07.2011, 17:04 | 3 |
оператор [] не выполняет проверку валидности индекса.
ты можешь вообще не выделять память и его использовать, но попадешь ли ты при записи в критическую зону, где запись чревата вылетом (или хуже) или в зону где по случайному обстоятельству всё обойдется - это рандом.
1
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
20.07.2011, 17:04 | 4 |
Это только кажется, что можно. На самом деле портятся данные (возможно полезные) в соседней области данных. Можешь считать, что тебе не повезло. Если бы повезло, то программа бы упала с ошибкой.
1
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
21.07.2011, 08:42 | 5 |
Чтобы избежать этой ошибки, нужно использовать std::vector и оператор at(), вместо []
0
|
21.07.2011, 10:11 | 6 | |||||
Можно даже при (случайном) выходе за пределы вектора сохранять работоспособность программы, сообщая при этом полезную информацию, например так:
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
21.07.2011, 10:27 | 7 |
Слабо в это верится. Часть программистов всенепременно перестанет пользоваться вектором т.к. "медленно же будет!".
С другой стороны, в большинстве случаев использовать operator[] и at() вообще нет необходимости и их применение вызвано дурным тоном программирования и грубым рефакторингом.
0
|
21.07.2011, 10:52 | 9 |
Но задачи бывают разные, нельзя не согласиться, что эти операторы очень даже нужны.
Добавлено через 1 минуту Да, именно этим аргументируется "возможность" пересмотра оператора [], т.е. пока думают.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
21.07.2011, 11:00 | 10 |
Безусловно нужны!
Но частенько они используются в циклах вида "for( int i; i < ; ++i) vector[i]", т.е. там, где их лучше не использовать. В том числе и с точки зрения производительности.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
21.07.2011, 12:44 | 11 |
oxotnik, Итераторы как бэ,
0
|
21.07.2011, 13:23 | 12 |
и чо? (неплохой аргумент, да?)
как итератором достучаться до i-го элемента без перебора? (если мне нужен рандомный доступ по индексу, ведь для этого собственно вектор и изобретали)
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
21.07.2011, 13:27 | 13 |
oxotnik, В векторе? Ничего не перепутали?)
iter + idx.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
21.07.2011, 13:32 | 14 |
0
|
21.07.2011, 14:13 | 15 |
т.е. вместо одной строки (кода) мне надо сначала определить итератор, потом его спозиционировать в начало, потом прибавить к нему индекс... про читабельность кода можно сразу забыть, как кошмарный сон.
а если не дай бох массивов будет N-ое количество, то лучше сразу повеситься.
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
21.07.2011, 15:29 | 16 | |||||
oxotnik, Тфу.
0
|
21.07.2011, 15:43 | 17 |
да, я чет не подумал о таком... но читабельности оно не прибавляет
Код
std::cout << *(elem.begin() + 5) << '\n'; // здесь надо тыщу раз подумать, что это, и что оно вернет, особенно звездочка с толку сбивает std::cout << elem[5] << '\n'; // тут понятно, что возвращает элемент массива
0
|
Twilight Parasite
154 / 150 / 7
Регистрация: 21.07.2011
Сообщений: 908
|
|
21.07.2011, 19:22 | 18 |
Используй malloc
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
21.07.2011, 19:27 | 19 |
Invader_Zim, что за шутки?
malloc пользуется какой-то запрещённой магией?
0
|
21.07.2011, 19:27 | |
21.07.2011, 19:27 | |
Помогаю со студенческими работами здесь
19
При копировании массива происходит выход за его пределы (Ошибка 216) Выход за пределы массива Выход за пределы массива Выход за пределы массива Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |