Переполнение стека при доступе к большому вектору - PullRequest
1 голос
/ 25 апреля 2010

Я получаю переполнение стека на первой итерации цикла for

for (int q = 0; q < SIZEN; q++)
{
    cout<<nList[q]<<" ";
}

nList - вектор типа int с 376 элементами. Размер nList зависит от константы, определенной в программе. Программа работает для каждого значения до 376, затем после 376 перестает работать.

Есть мысли?

Ответы [ 3 ]

6 голосов
/ 25 апреля 2010

Если под «перестаёт работать», вы имеете в виду сбой, то вы, вероятно, читаете за концом буфера.vector::operator[] не проверяется по дальности, поэтому он позволит вам выстрелить себе в ногу.

Если вы хотите пройти вектор, используйте итератор или, по крайней мере, nList.size().

То есть с наименьшими изменениями в вашем коде:

for (int q = 0; q < nList.size(); q++)
{
    cout << nList[q] << " ";
}

или с итераторами

for (std::vector<int>::const_iterator it = nList.begin();
     it != nList.end(); ++it) {
  cout << *it << " ";
}
1 голос
/ 25 апреля 2010

Мое первоначальное предположение здесь состоит в том, что вектор меньше 376. Оператор [] не дает никаких гарантий относительно того, что он пересекает фактические векторные границы. Вы были бы НАМНОГО безопаснее, если бы использовали функцию at:

for(int i=0; i < nList.size(); ++i){
  cout << nList.at(q) << " ";
}

там, если q находится вне вектора, он выдаст исключение. Это поможет диагностировать этот тип проблемы во время выполнения.

0 голосов
/ 25 апреля 2010

Если вы добавили 376 элементов к вектору, используя, например, push_back, то нормально, что доступ со значениями, превышающими 376, приводит к сбою программы, вы получаете доступ к неинициализированной и неуправляемой памяти.

...