Форум программистов, компьютерный форум CyberForum.ru

Обращение к элементам вектора - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.79
zuq
 Аватар для zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
25.07.2011, 23:24     Обращение к элементам вектора #1
Вопрос вот в чем. Есть следующий код:
C++
1
2
3
4
5
6
7
8
9
#include <vector>
#include <iostream>
 
int main() {
 
    std::vector<int> a(10, 1);
 
    std::cout << a[2061];
}
MinGw - его прекрасно компилит, и программа работает! Выводит 55328 А по идее должна вылетать. Если же обратится к 2062 элементу - ошибка при выполнении. Собственно, почему это работает??
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 23:26     Обращение к элементам вектора #2
Цитата Сообщение от zuq Посмотреть сообщение
А по идее должна вылетать. Если же обратится к 2062 элементу - ошибка при выполнении.
с чего вы это взяли? доступ к элементу вектора через [] не контролируется
если бы вы написали
C++
1
2
3
4
5
6
7
8
9
#include <vector>
#include <iostream>
 
int main() {
 
    std::vector<int> a(10, 1);
 
    std::cout << a.at(2061);
}
было бы исключение std::out_of_range
zuq
 Аватар для zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
25.07.2011, 23:27  [ТС]     Обращение к элементам вектора #3
В студии вылетает. Откуда он тогда берет это число?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 23:30     Обращение к элементам вектора #4
Цитата Сообщение от zuq Посмотреть сообщение
В студии вылетает. Откуда он тогда берет это число?
это в дебаге, а вы поставте release mode
zuq
 Аватар для zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
25.07.2011, 23:33  [ТС]     Обращение к элементам вектора #5
В relase можно до 2059
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 23:36     Обращение к элементам вектора #6
а вы не из VS запустите
zuq
 Аватар для zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
25.07.2011, 23:43  [ТС]     Обращение к элементам вектора #7
Сейчас нашел в книге, что-то вроде - "стандарт ничего не говорит о том, что может произойти в данном случае". Но все же - странно....
Paporotnik
383 / 227 / 7
Регистрация: 06.07.2011
Сообщений: 512
25.07.2011, 23:45     Обращение к элементам вектора #8
из под NetBeans (MinGW) что в дебаге, что в релизе выкидывает ексепшн
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 23:49     Обращение к элементам вектора #9
Цитата Сообщение от zuq Посмотреть сообщение
"стандарт ничего не говорит о том, что может произойти в данном случае"
потому что стандарт не знает что хранится в конкретной ячейке памяти за пределами вектора, undefined behavior
zuq
 Аватар для zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
25.07.2011, 23:50  [ТС]     Обращение к элементам вектора #10
То есть вы хотите сказать, что результат выполнения будет зависеть от того, что храниться в конкретной ячейке памяти?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
25.07.2011, 23:59     Обращение к элементам вектора #11
Результат, в первую очередь, будет зависеть от того, разрешён ли доступ на чтение по данному адресу (это зависит и от ОС и от компилятора). И если вдруг разрешён, тогда уж от того, что там хранится. Но при каждом запуске программы там могут храниться разные данные.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
25.07.2011, 23:59     Обращение к элементам вектора #12
deleted
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
25.07.2011, 23:59     Обращение к элементам вектора #13
Но такое использование — это явная ошибка.
zuq
 Аватар для zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
26.07.2011, 00:02  [ТС]     Обращение к элементам вектора #14
Понятно, что это ошибка От этого нас может защитить функция at()
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
26.07.2011, 00:04     Обращение к элементам вектора #15
Может. Но лично я предпочитаю защищаться функцией assert. В рабочем коде, как правило, лишние проверки не нужны. А .at() там, где живучесть программы прежде всего.
zuq
 Аватар для zuq
95 / 95 / 2
Регистрация: 10.04.2011
Сообщений: 256
26.07.2011, 00:07  [ТС]     Обращение к элементам вектора #16
Что-то я не понял, что делает функция assert..
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
26.07.2011, 00:13     Обращение к элементам вектора #17
В release версии ничего. Она вообще выкидывается из программы (строго говоря это макрос).
А в debug версии если аргумент равен нулю (ложь) то программа завершается с выводом номера строки и выражения (то есть аргумента assert)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2011, 00:53     Обращение к элементам вектора
Еще ссылки по теме:

C++ Обращение к элементам std::vector используя указатель
C++ Сортировка эл-ов списка, обращение к элементам
Обращение к элементам матрицы C++

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

Или воспользуйтесь поиском по форуму:
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
26.07.2011, 00:53     Обращение к элементам вектора #18
2 zuq
для доступа к элементам вектора можно использовать итераторы, с проверкой не указывает ли итератор на end(). Этот подход - так называемая идиома STL в использовании контейнеров ( взято из одного из изданий книги Стенли Липпмана ) .
В случае обращения к несуществующему элементу вектора - предсказать результат нельзя заранее.
Вот цитата из книги Стенли Липпман "Язык программирования C++ вводный курс" 4 изд. стр. 119:
Очень важно понять, что оператор индексирования ( [] ) можно использовать для доступа только к фактически существующим элементам.
...
...
Попытка обращения во время выполнения программы к несуществующему элементу является серьезной ошибкой. Подобно большинству подобных ошибок, практически ни одна из реализаций компилятора не обнаруживает их. Результат выполнения такой программы непредсказуем, однако почти наверняка такая программа правильно работать не будет.
...
...
Попытка индексирования несуществующих элементов, к сожалению, является весьма распространенной и грубой ошибкой программирования. Так называемая ошибка переполнения буфера ( buffer overflow ) - результат индексирования несуществующих элементов. Такие ошибки являются наиболее распространенной причиной проблем защиты приложений.
Yandex
Объявления
26.07.2011, 00:53     Обращение к элементам вектора
Ответ Создать тему
Опции темы

Текущее время: 06:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru