我想在Irrlicht游戏中使用Irrnet网络库。
源代码使用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
答案 0 :(得分:4)
我认为“停止”你的意思是“以某种方式”崩溃?可能导致线路崩溃的原因是:
NetworkType
方法的getNextItem()
实例是垃圾(this
指针是垃圾或空)。这可能是由于其他地方的错误指针数学,过早删除或实例的破坏等等。当程序试图访问items
成员时,这将表现为错误。items
容器为空。在这些情况下,front()
的返回值是未定义的(因为它是一个引用),istringstream
的构造函数可能会崩溃。 front()
本身也可能会引发调试/运行时检查错误,具体取决于您的编译器及其配置。答案 1 :(得分:1)
如果出列队列为空,实际上您可能会遇到运行时错误:MSDN deque
因此,在尝试从中弹出值之前,请检查deque是否为空。
if(items.size()>0)
{
//do things
}
else
{
//error deque empty
}
[编辑]混淆std和(我猜)MSDN(OP不说)lib。