Вектор в C ++: почему внешнее измерение дает EXC_BAD_ACCESS, а внутреннее измерение - нет? - PullRequest
1 голос
/ 22 декабря 2011

У меня есть следующий код для вектора векторов целых чисел (то есть целочисленной матрицы ..)

vector<vector<int> > scores (3, vector<int>(2,0));
cout<<scores[1][5];

Это не дает EXC_BAD_ACCESS, но это делает:

cout<<scores[5][1];

Почему разница в поведении?

Просто чтобы уточнить: это не относится только к приведенным номерам примеров. Когда внутреннее измерение выходит за границы, ошибки никогда не бывает, в отличие от внешнего!

Ответы [ 3 ]

6 голосов
/ 22 декабря 2011

В любом случае доступ к границам не определен.

Так что разрешено все, что угодно.Просто «случается», что один случай падает, а другой нет.


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

Но во втором случае вы получаете доступ к плохому vector объекту.Поскольку объект vector является просто оболочкой для указателя, разыменование этого (плохого) указателя на втором индексе приведет к сбою.

1 голос
/ 22 декабря 2011

Теоретически ни один не должен работать, однако, operator[] не требуется для проверки доступа к границам (в то время как at() есть).Таким образом, вызов scores[1][5] отключен в неопределенную область поведения, что, к сожалению, в этом случае не вызывает сбой.Это просто еще одно применение принципа «неопределенное поведение в C / C ++ может делать что угодно».

0 голосов
/ 22 декабря 2011

Если вы нарушите правила, у вас нет никаких гарантий, что произойдет. Иногда это будет одно, а иногда другое. Вот почему так важно следовать правилам. Это то, что дает вам предсказуемое поведение.

Если вы останетесь ниже ограничения скорости, вас никогда не остановят для превышения скорости. Если вы превышаете лимит, иногда вас задерживают, а иногда нет.

...