2016-02-21 26 views
-2

我有一堆結構。我將它們中的一些在代碼中的某個地方推入,當我彈出一個代碼時,除矢量成員正確彈出之外的所有值。當它不應該時,矢量會變空。 (size = 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; 
} 

這些條件是在一個while循環。

+1

請添加一個最小的,可驗證的完整示例來重現您的問題。 –

+1

編寫'(* current).ways.size()'的通常方法是'current-> ways.size()'。 –

+0

在我看來,你需要一個指向堆棧頂部元素的指針,然後彈出它。問題在於popping會刪除並銷燬堆棧頂部的元素,因此您的指針不再有效,現在解除引用會變成未定義的行爲。 –

回答

1

我假設您的djikstra對象的類型爲std::stack。我看到不好的事情發生在這裏

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

從你的片段,current是一個指針,這就是爲什麼你從&djikstra.top();分配給它......記住,top()返回頂端元素的引用,並在下一行你做一個pop() ...

current現在持有一個無效的指針。