为什么我的程序在std :: queue上调用front()时会停止?

时间:2011-10-14 13:32:12

标签: networking libraries irrlicht

我想在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

2 个答案:

答案 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。