2015-05-13 4 views
-4

Я боюсь случайного исключения при использовании std :: vector.C++ vector push_back нарушение прав доступа

Вот основные элементы:

struct Stroke 
{ 
    std::vector<vec2> points; 
    Pixel color; 
    std::vector<unsigned int> pixelIds; 
}; 

void myFunc() 
{ 
    while (strokes.size() < 5000) 
    { 
     if (/*A condition that is always met at some point*/) 
     { 
      break; 
     } 
     //Some code 
     newStroke->pixelIds.clear(); 
     newStroke->pixelIds.resize(0); 
     strokes.push_back(newStroke); 
    } 


    for (int i = 0; i < strokes.size(); ++i) 
    { 
     drawStroke(strokes[i]); 
    } 
} 



void drawStroke(Stroke * currentStroke) 
{ 
    std::vector<int> roundIds; 

    //Fill roundIds 

    //Some loops and conditions 
    for (int i = 0; i < roundIds.size(); ++i) 
    { 
     if (/*Check condition*/) 
     { 
      // Exception is raised deeper in the stack here 
      currentStroke->pixelIds.push_back(currentRoundId); 
     } 
    } 
} 

я ушел из большой части кода, которые не должны реально повлиять на это, потому что я понятия не имею, где эта проблема может исходить от (так что я должен был бы скопируйте/вставьте весь код: D). В последней строке я случайно получаю нарушение доступа глубже в стеке (метод _Orphan_Range для std :: vector).

Я не вижу ничего плохого в currentStroke в часах, вектор точек выглядит нормально, цвет тоже, я предполагаю, что некоторые внутренние значения пиксельных идентификаторов сломаны (_Myfirst = 0x000000000038c700 _MyEnd = 0x000000000038c74c не выглядит слишком хорошо для меня, но я не уверен).

Я не очень разбираюсь в деталях STL, и я не знаю, что искать особенно потому, что вектор содержит только значения unsigned int, а не какой-то фантастический странный класс или структуру, и я понятия не имею, когда-либо испортили внутренние значения вектора.

Любое предложение или совет будут оценены! Спасибо!

+3

это 'while (true)' часть убивает все – davidhigh

+2

Стандартная технология отладки: удалите части, которые не должны влиять на проблему, а затем _run код left over_, чтобы увидеть, есть ли у вас проблема. Если у вас нет проблемы, вы нарушили свои заблуждения. Если у вас все еще есть проблема, то удалите части, которые, по вашему мнению, станут проблемой, пока у вас не будет проблемы. Когда проблема уходит, у вас есть очень хорошая идея, где проблема. – Hurkyl

+0

@ davidhigh: Наверное, я забыл слишком много частей реального кода. У меня есть условие, чтобы разбить этот цикл, и я уверен, что он попадает каждый раз. (Мы можем спорить о плохом дизайне, но проблема не связана с тем, что этот цикл бесконечен.) – Xelareip

ответ

4

myFunct имеет бесконечный цикл, который заполняет стоковый вектор, пока вы не выйдете из памяти.

+0

Наверное, я забыл слишком много частей фактического кода. У меня есть условие, чтобы разбить этот цикл, и я уверен, что он попадает каждый раз. Насколько я знаю, моя память прекрасна (процесс использует только несколько Мбайт ОЗУ). Я отредактирую сообщение, чтобы это отразить. – Xelareip

+1

@Xelareip: Затем разместите свой _testcase_, который воспроизводит проблему. Мы ничего не можем сделать с какой-то произвольной частью кода, которая не имеет никакой полезной связи с той, о которой вы просите. –

Смежные вопросы