2013-08-27 36 views
0

我在我的C++程序中遇到了段錯誤,無法找出我的錯誤。
我有一個Map類,它是類MapCells對象的2D向量。任務是從一個細胞到另一個細胞。從每個細胞中,有兩種可能的方式來處理其他細胞。也許一些「僞」代碼可以更好地解釋它:在C++中使用向量中的指針後發生Segfault

//map.h 

class MapCell { 
private: 
    MapCell *p_way1_, *p_way2_; 
    int some_information_; 

public: 
    MapCell* getWayPointer1(); 
    MapCell* getWayPointer2(); 
    int getInformation(); 

    void setWayPointer1(MapCell* new_p_way1); 
    void setWayPointer1(MapCell* new_p_way2); 
}; 

class Map { 
private: 
    std::vector< std::vector<MapCell> > map_; 
public: 
    void initializeMap(); 
    MapCell* getStartPointer(); 
}; 

int main() 
{ 
    Map map; 
    map.initializeMap(); 

    MapCell *p_current_cell, *p_next_cell; 
    p_current_cell = map.getStartPointer(); 

    while(p_current_cell->getInformation() != 0) 
    { 
     if(p_current_cell->getInformation() == 1) 
     { 
      p_next_cell = p_current_cell->getWayPointer1(); 
     } 
     else 
     { 
      p_next_cell = p_current_cell->getWayPointer2(); 
     } 

     p_current_cell = p_next_cell; 
    } 

    return 0; 
} 

這只是實際代碼的一小部分。但我認爲我犯了一個根本的錯誤,所以我希望這是足夠的代碼來解決它。 問題是,我的代碼在沒有問題的情況下運行了幾分鐘,突然間發生了段錯誤。 gdb指出,段錯誤發生在調用getInformation()時。 我也發現,在某些時候,所有的p_way2_向量都會導致無意義。 你能幫我嗎?

非常感謝您提前!

+3

沒有看到的實現你的'getStartPointer'和'getInformation',等等,這是不可能說什麼可能會錯誤。 –

+0

我同意第一條評論。這可能是你的週期終止條件有問題。你確定每個單元格中指針的設置方式嗎?也許將它們初始化爲NULL並在循環中檢查NULL將是更安全的方法。 –

+0

getInformation()是一個常規的getter函數。 getStarterPointer()就像'return&map_.at(0).at(0);'。 –

回答

0

問題在線路

MapCell* p_current_cell, p_next_cell; 

MapCell* p_way1_, p_way2; 

第二個參數不是指針,MapCell爲指針隱含轉換(或你會得到多個編譯時間錯誤)。 嘗試改變

MapCell* p_current_cell, *p_next_cell; 

MapCell* p_way1_, *p_way2; 
+0

對不起,這只是問題中的錯誤。實際的代碼是正確的考慮到這一點。 –