Странное поведение функции c ++, не возвращая тот же ответ

Я создаю класс очереди в C ++, и у меня возникают проблемы с работой фронтальной функции. Предполагается вывести значение первого узла в очереди. Мой класс queue.cpp здесь

#include "queue.h"#include <stdlib.h>
#include <iostream>
using namespace std;

queue::queue()
{
front_p = NULL;
back_p = NULL;
current_size = 0;
}

void queue::enqueue(int item)
{
node newnode = node(item, NULL);
if (front_p == NULL) //queue is empty
{
front_p = &newnode;
back_p = &newnode;
}
else
{
back_p->next = &newnode;
back_p = &newnode;
}
current_size ++;
}

int queue::dequeue()
{
//if there is only one node
if (front_p == back_p)
{
front_p = NULL;
back_p = NULL;
}
//if there are two or more
else
front_p = front_p->next;
current_size --;
}

int queue::front()
{
if (front_p != NULL)
return (*front_p).data;
}

bool queue::empty()
{
if (front_p == NULL && back_p == NULL)
return true;
else
return false;
}

int queue::size()
{
return current_size;
}

Мой заголовочный файл (queue.h) находится здесь

class queue
{
public:
queue(); // constructor - constructs a new empty queue.
void enqueue( int item ); // enqueues item.
int dequeue();  // dequeues the front item.
int front();   // returns the front item without dequeuing it.
bool empty();  // true iff the queue contains no items.
int size();  // the current number of items in the queue.
int remove(int item); // removes all occurrances of item
// from the queue, returning the number removed.

private:
class node  // node type for the linked list
{
public:
node(int new_data, node * next_node ){
data = new_data ;
next = next_node ;
}
int data ;
node * next ;
};

node* front_p ;
node* back_p ;
int current_size ; // current number of elements in the queue.
};

тестовая программа (tester.cpp)

#include <iostream>
#include "queue.h"#include <stdlib.h>
using namespace std;

int main(int argc, char * const argv[])
{
queue q1;
q1.enqueue(5);
cout << "front: " << q1.front() << endl;
cout << "front: " << q1.front() << endl;
cout << "front: " << q1.front() << endl;
q1.enqueue(10);
cout << "front: " << q1.front() << endl;
cout << "front: " << q1.front() << endl;
cout << "size: " << q1.size() << endl;
}

Makefile

all: tester

tester: queue.o tester.o
g++ tester.o queue.o -o tester

tester.o: tester.cpp
g++ -c tester.cpp

queue.o: queue.cpp queue.h
g++ -c queue.cpp

clean:
rm -f tester *.o

Когда я запускаю свою тестовую программу, я получаю это:

front: 5
front: 6299744
front: 6299744
front: 10
front: 6299744
size: 2

Как вы можете видеть, после первого включения front возвращает то, что он должен, значение начала очереди. Но после этого он возвращает какое-то странное число, и я понятия не имею, откуда оно! Затем, когда я снова ставлю в очередь, он снова печатается нормально. Только после двойного вызова front он начинает печатать испорченные значения. Может кто-нибудь помочь мне понять, что происходит?

-1

Решение

Ваша программа работает с неопределенным поведением, потому что у вас есть указатели на память, которой вы не владеете:

void queue::enqueue(int item)
{
node newnode = node(item, NULL);
if (front_p == NULL) //queue is empty
{
front_p = &newnode;
back_p = &newnode;
}
else
{
back_p->next = &newnode;
back_p = &newnode;
}
current_size ++;
}

В конце функции, newnode разрушен, но front_p а также back_p все еще указывают на эту область памяти. Либо выделить динамически:

node* newnode = new node(item, NULL);

или использовать std::shared_ptr<node>,

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]