Фантомные ошибки с использованием очереди (библиотека STL), Windows / MingW / G ++ - PullRequest
0 голосов
/ 15 апреля 2011

У меня возникли две непредвиденные проблемы с использованием очереди из библиотеки STL:

1) Я пытаюсь очистить очередь (в очереди нет функции очистки), но интуитивно понятный способ дает мнеОСНОВНОЙ ДАМП:

//The queue is defined Globally but the problem happens even
//if i define it locally and pass it by reference.
queue<pair<int,int> > Q;

void yadayada ()
{
    //initialize Q
    while (!Q.empty())
        Q.pop();   //CORE DUMP, what the hell?
}

2) Когда я печатаю элемент (пару) с фронта очереди, он ошибочно печатается как (0,0).Но когда я использую элемент (возвращая второй элемент в паре), это правильно!

int yadayada2(...) 
{
//code...code...code

//the element in front is (4,20)
front = Q.front(); Q.pop();

cout << "(" << front.first << "," << front.second << ")" << endl;
//prints: (0,0) 
//what the hell?

//correctly returns 20
return front.second;
}

int main()
{
//code...code...code 

//prints 20!
cout << yadayada2 << endl;
}

Я думаю: «Возможно, pop отменяет действие элемента (не имеет смысла, но ...), поэтому япереместил Q.pop (); непосредственно перед возвратом. Но то же самое все еще происходит ...

Ответы [ 2 ]

4 голосов
/ 15 апреля 2011

Лучший способ очистить очередь:

Q = queue< pair< int, int > >(); // assign value of an empty temporary

Что касается ошибки front, я должен согласиться с Оли и подозревать, что существует недопустимая ссылка.

2 голосов
/ 15 апреля 2011

На WTF:

  • любой ваш код немного более неправильный в реальной жизни (например, с заменой int на что-то другое, например, с использованием auto_ptr, классов без надлежащей семантики копирования / назначения)и т. д.)

  • ИЛИ: ваша установка mingw не работает.

Я только что скомпилировал оба фрагмента, используя g ++ на linux И i586-mingw32msvc-g ++, и запустил его под Wine AND valgrind ... без проблем:)

...