2011-10-14 22 views
2

我想在Irrlicht遊戲中使用Irrnet網絡庫。爲什麼我的程序在調用std ::隊列的front()時停止?

源代碼使用Linux套接字,我試圖移植它的Windows替換它使用Windows'Winsock2的代碼。

庫編譯成功,但是當我嘗試運行Quake示例時,它崩潰了。我找到程序停止的那一行,但我無法弄清楚如何解決這個問題。

程序停止在該函數的第二個電話在GetNextItem

class NetworkType { 
    public : 
     NetworkType(); 
     ~NetworkType(); 
     template<class T> 
     void getNextItem(irr::core::vector3d<T>& data); 

    private: 
     typedef std::queue<std::string> Container; 
     Container items; 
}; 

template<class T> 
void NetworkType::getNextItem(irr::core::vector3d<T>& data) { 
    T X, Y, Z; 

    std::istringstream item(items.front()); 
    // the program does not get here the second time it calls this function 
    items.pop(); 

    item >> X; 
    item >> Y; 
    item >> Z; 

    data = irr::core::vector3d<T>(X, Y, Z); 
} 

,準確地在該行

std::istringstream item(items.front()); 

誰能告訴我,爲什麼程序停止它得到了第二次到這條線?

這裏是link的完整源代碼

+4

這似乎沒有與遊戲開發相關,可能更適合StackOverflow;我已經提出了遷移考慮的問題。 –

+0

Assert(!items.empty());你應該總是編碼你的假設。 – dcousens

回答

4

我想通過「停止」你以某種方式表示「崩潰」?對於所討論就行了碰撞可能的原因是:

  • NetworkType實例被調用getNextItem()方法是垃圾(該this指針是垃圾或空)。這可能是由於其他地方的指針數學錯誤,實例的過早刪除或破壞等原因造成的。當程序試圖訪問items成員時,這會表現爲錯誤。
  • items容器爲空。在這些情況下,返回值front()未定義(因爲它是參考),並且istringstream的構造函數可能會崩潰。 front()本身可能會引發調試/運行時檢查錯誤,具體取決於您的編譯器及其配置。
+0

是的,「停止」我的意思是「崩潰」。這裏是Irrnet [link](https://github.com/bwright/gsoc)源代碼的鏈接。這可能有助於找到確切的原因。 –

1

其實,如果出列是空的,你可能會對這一個運行時錯誤:MSDN deque

所以只是檢查雙端隊列不爲空,試圖從它彈出一個值之前。

if(items.size()>0) 
{ 
//do things 
} 
else 
{ 
//error deque empty 
} 

confounded std和(我猜)MSDN(OP不說)lib。

+0

我終於發現隊列是空的,因爲返回它的_recvfrom_不成功。 –

+0

這個答案是錯誤的,令人困惑的是'front'和'begin'。如果矢量爲空,'front'不確定。喬希的回答涵蓋了這一點。 – 2011-10-16 15:59:54

+0

(編輯錯字)是的你是對的,我迷惑了stl庫(它甚至沒有'前面'),我猜MSDN庫。 stl :: deque使用pop_front()並按照我的說法工作,但我改變了答案。 – Valmond

相關問題