Ошибка сегментации при чтении вектора

в программе на c++, когда я хочу прочитать вектор с размером 2697806, я всегда получаю ошибку ошибки сегментации. Я перепробовал все возможные способы его чтения:--2-->

void AUROC(vector<float> v) {
   ...
   for(std::vector<int>::size_type i = 0; i != v.size(); i++)
      if (v[i]>0) ++pos; else ++neg;

   for(std::vector<long>::size_type i = 0; i != v.size(); i++)
     if (v[i]>0) ++pos; else ++neg;

   for (vector<float>::iterator i=v.begin(); i!=v.end(); ++i)
     if (*i>0) ++pos; else ++neg;

   for (long i=0;i<=v.size();i++)
     if (v[i]>0) ++pos; else ++neg;

   for(int i=0;i<=v.size();i++)
     if (v[i]>0) ++pos; else ++neg;
}

...
int main(void) { 
    vector<float> scores;
    // put data in scores;
    AUROC(scores);
}

эта проблема никогда не возникает с векторами гораздо меньших размеров.

Спасибо за помощь. Лучший, Pegah

5 ответов


поскольку он работает для меньших размеров, я лучше всего предполагаю, что у вас заканчивается пространство стека. Как проверить пространство стека и изменить его, зависит от вашей ОС: на Linux run ulimit -s чтобы проверить и ulimit -s SIZE установить.

дальнейшее чтение:http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/


Я знаю, что вы уже приняли ответ, но ваш опубликованный код имеет проблему со следующим циклом:

for(int i=0;i<=v.size();i++)

векторные индексы основаны на нуле. Если размер вектора равен 5, то допустимые индексы равны 0..4. Ваш код попытается получить доступ к элементам 0..5 что является ошибкой off-by-one. Я считаю, что ваше "исправление" размера стека просто маскирует другие реальные проблемы.

кроме того, вы должны передавать вектор по ссылке, а не по значению. Ты в настоящее время копирование вектора при вызове AUROC(vector<float> v). Это медленная и экстравагантная трата памяти. Измените функцию на AUROC(vector<float> &v).


когда вы вызываете свою функцию как:

vector<float> scores;
// put data in scores;
AUROC(scores);

на scores вектор будет скопирован в стек. Вы не должны передавать такие большие коллекции данных (12 Мбайт) через стек, изменять свой код на ссылку или на передачу указателя.

кроме того, вы можете проверить и изменить ограничения стека на вашем Хосте. В unix:

ulimit -s 

напечатает текущую настройку stacklimit. Вы можете изменить его на

ulimit -s size_in_kb

и проверьте его после изменения


Это:

for (long i=0;i<=v.size;i++)

должно быть:

for (long i=0;i<=v.size();i++)

и подобное в другом месте.


интересно, может быть, вы возитесь со стеком.

оберните этот

if (v[i]>0) ++pos; else ++neg;

в фигурные скобки.

{ if (v[i]>0) ++pos; else ++neg; }