Переполнение стека при доступе к большому вектору

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

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

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

Какие-нибудь мысли?


person cam    schedule 25.04.2010    source источник
comment
Покажите, как заполняется и определяется nList.   -  person Alex Budovski    schedule 25.04.2010
comment
376 предметов - это совсем немного :).   -  person kennytm    schedule 25.04.2010
comment
не лучше ли использовать nList.size() вместо SIZEN в качестве условия управления циклом?   -  person AndersK    schedule 25.04.2010
comment
Конечно, он перестанет работать, если вы попытаетесь получить доступ к несуществующим элементам. В чем именно заключается ваш вопрос?   -  person fredoverflow    schedule 25.04.2010
comment
‹sarcasm›Вопросы о переполнении стека относятся к meta.stackoverflow‹/sarcasm›   -  person Ben Voigt    schedule 25.04.2010
comment
Откуда вы знаете, что ваша проблема связана с переполнением стека. И, как указывали другие, ваш вектор невелик. Пожалуйста, не пытайтесь предварительно диагностировать вашу проблему при публикации здесь - просто сообщите нам соответствующий код и симптомы.   -  person    schedule 25.04.2010


Ответы (3)


Если под «перестает работать» вы имеете в виду сбои, то вы, вероятно, читаете дальше конца буфера. 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 << " ";
}
person Alex Budovski    schedule 25.04.2010

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

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

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

person wheaties    schedule 25.04.2010

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

person Vicente Botet Escriba    schedule 25.04.2010