Доступ к записи нарушений в двухсторонней очереди

Я пытаюсь создать двустороннюю очередь с C ++.
Я использую Visual Studio 2012 и продолжаю получать:

First-chance exception at 0x00D95A29 in Console_Assignment1.exe: 0xC0000005: Access violation writing location 0x00000008.

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

(Код слишком длинный для вставки, поэтому я просто скопирую функции, которые, как мне кажется, создают мне проблему.)
Может быть, просто небольшой обзор. У меня есть класс узла, который содержит два указателя на узел (следующий и предыдущий) и int (значение). и класс очереди, который содержит два указателя на узел (первый и последний) и int (размер).

// enqueueBeg - adds a new node at the beginning of the queue.
void DBL_Queue::enqueueBeg(int insert_val)
{
node* new_node = new node(insert_val);  // Creates the new node.
new_node->setNext( this->getFirst() ); // Connects the new node to the first in the queue
this->getFirst()->setPrev( new_node ); // Connects the first node in the queue to the new one
this->setFirst( new_node );             // Sets the new node as the first in the queue
this->setSize ( this->get_queue_size() + 1 ); // adds 1 to the size of the list

// dequeueBeg - removes the first node of the queue.
int DBL_Queue::dequeueBeg()
{
int ret_value = this->getFirst()->getVal();
node* old_node = this->getFirst();
this->setFirst( this->getFirst()->getNext() ); // Sets the second node in the queue as the first.
this->getFirst()->setPrev( NULL ); // Removes the link between the new first new and the old one.
this->setSize( this->get_queue_size() - 1); // Removes 1 from queue size
delete old_node;  // Deletes the node that use to be first.
return ret_value; // Returns the value of the old node.

// DBL_Queue Destructor
DBL_Queue::~DBL_Queue()
{
if (this->first == NULL)   // if queue is empty do nothing
return;
else
{
while (this->first->getNext() != NULL)  // go through all nodes and delete them one by one
{
node* deletion = this->getFirst();
this->setFirst( this->getFirst()->getNext() );
delete deletion;
}
}
}

Заранее спасибо за помощь!

4

Решение

Я думаю, что это ваша проблема

 while (this->first->getNext() != NULL)  // go through all nodes and delete them one by one
{
node* deletion = this->getFirst();
this->setFirst( this->getFirst()->getNext() );
delete deletion;
}

Когда вы удалите последний узел, вы позвоните

this->setFirst( null );

так как this->getFirst()->getNext() будет нулевым, верно?
Итак, тогда while(this->first->getNext() становится null->getNext()

Почему не просто

while(this->first != NULL)

?

Изменить: если вы действительно не заботитесь о минимизации времени работы деструктора, почему бы и нет

while(this->getFirst() != NULL) {this->dequeueBeg;}
0

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

Комментарий Иоахима:
«Пробовали ли вы запустить в отладчике? Это поможет вам определить, где происходит сбой, а также позволит вам изучить переменные, чтобы понять, что могло их вызвать. Однако вы уже подумали о том, что происходит, когда вы ставите в очередь первый узел? , то есть нет текущего первого узла (то есть this-> getFirst () возвращает NULL)? У вас есть похожие проблемы с функцией удаления очереди. «

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

Спасибо всем!

0

По вопросам рекламы ammmcru@yandex.ru