2016-02-21 2 views
-2

У меня есть стек структур. Я нажимаю некоторые из них где-то в моих кодах, и когда я выхожу один, все значения, за исключением того, что член вектора правильно отображается. Вектор пуст, когда он не должен. (размер = 0) see the imageПочему он выталкивает пустой вектор из стека?

Я добавил часы для складывания. Когда структура находится в стеке, ее векторный член имеет размер = 2, хороший, но как только я нахожу структуру, векторный член становится пустым. Где я поступаю неправильно?

я нажимаю здесь:

if ((*current).ways.size() > 1){ 
     p[(*current).number].ways_holder++; 
     djikstra.push(p[(*current).number]); //in case there are more than one way 
} 

и поп здесь:

else if ((*current).ways.size() == (*current).ways_holder){  //ordan bir yere gidemiyorsan current stacktekine eşitlensin 
     if (djikstra.empty()) 
      break; 
     current = &djikstra.top(); 
     djikstra.pop(); 
     cost_passer = (*current).cost_passer; 
} 

эти условия в цикле в то время.

+1

Пожалуйста, добавьте минимальный, поддающийся проверке, полный пример, чтобы воспроизвести вашу проблему. –

+1

Обычный способ записи '(* current) .ways.size()' is current-> ways.size() '. –

+0

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

ответ

1

Я предполагаю, что ваш djikstra объект имеет тип std::stack. Я вижу плохие вещи здесь происходит

current = &djikstra.top(); 
djikstra.pop(); 

С вашего сниппета, current указатель, поэтому вы назначаете его от &djikstra.top(); ... Помните, что top() возвращает ссылку на верхний элемент, а в следующей строке вы делаете pop() ...

current теперь содержит указатель недействительный.

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