Почему моя программа останавливается при вызове front () в очереди std :: queue? - PullRequest
2 голосов
/ 14 октября 2011

Я хочу использовать сетевую библиотеку Irrnet в игре Irrlicht.

Исходный код использует сокеты 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());

Может кто-нибудь сказать мне, почему программа останавливается во второй раз, когда она достигает этой строки?

вот ссылка для полного исходного кода

Ответы [ 2 ]

4 голосов
/ 14 октября 2011

Я предполагаю, что под "остановками" вы подразумеваете "сбой" каким-то образом?Возможные причины сбоя в рассматриваемой строке:

  • Экземпляр NetworkType, который вызывает метод getNextItem(), является мусором (указатель this является мусором или равен нулю).Это может произойти из-за плохой математики указателя в другом месте, преждевременного удаления или уничтожения экземпляра и так далее.Это может проявиться как ошибка при попытке программы получить доступ к элементу items.
  • Контейнер items пуст.В этих случаях возвращаемое значение front() не определено (так как это ссылка), и конструктор для istringstream может быть сбой.front() сам по себе может вызывать ошибку проверки отладки / времени выполнения в зависимости от вашего компилятора и его конфигурации.
1 голос
/ 16 октября 2011

На самом деле вы можете иметь ошибку времени выполнения на этом, если очередь пуста: MSDN deque

Так что просто убедитесь, что deque не пуст, прежде чем пытаться извлечь значение из него.

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

[править] confused std и (я думаю) MSDN (OP не говорит) lib.

...