4

C ++で両面キューを作成しようとしています。私は Visual Studio 2012 を使用していますが、取得し続けています:

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

私はポインターの問題を抱えていると思います(すべきではないものを逆参照しようとしている可能性があります)。これまでのところ、問題を見つけることができなかったので、もう一度見ていただければ幸いです。

(コードは貼り付けるには長すぎるので、問題を引き起こしていると思われる関数だけをコピーします。) たぶん、簡単な概要です。ノードへの2つのポインタ(次と前)とint(値)を保持するノードクラスがあります。ノードへの 2 つのポインター (最初と最後) と 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

2 に答える 2

0

Joachim のコメント: 「デバッガーで実行してみましたか? クラッシュの場所を特定するのに役立ちます。また、変数を調べて、何が原因であるかを確認することもできます。しかし、エンキューしたときに何が起こるか考えたことはありますか?つまり、現在の最初のノードがないことを意味します (つまり、this->getFirst() は NULL を返します)? デキュー関数で同様の問題があります。"

解決策でした。私の問題は、空のキューへの挿入または最後のノードの削除を正しく処理しなかったことです。

皆さんありがとう!

于 2012-11-03T21:54:31.233 に答える
0

これがあなたの問題だと思います:

 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()nullになるからですよね?そうなるとwhile(this->first->getNext()_null->getNext()

なぜだけではないのですか

while(this->first != NULL)

?

編集:デストラクタの実行時間を最小限に抑えることを本当に気にしない限り、そうしないのはなぜですか

while(this->getFirst() != NULL) {this->dequeueBeg;}
于 2012-11-03T20:42:10.980 に答える