引发异常:写访问冲突(this-> tail为nullptr)

时间:2018-10-11 05:46:13

标签: c++ exception linked-list access-violation throw

我已经编译了我的代码,它似乎可以正常工作。但是我从无处得到错误(this-> tail是nullptr)。我尝试更改新节点的创建。但是似乎没有任何作用。我不知道将tail设置为nullptr并弄乱了代码。

我将如何解决此问题?有没有办法在不破坏其他所有功能的情况下将tail设置为non-nullptr?我对异常抛出不太熟悉,因此,如果您能解释这种情况,将会很有帮助。

#ifndef MYDLL_H
#define MYDLL_H

#include <iostream>
#include <new>
using namespace std;

class MyDLL
{
    struct Node
{
    int i;
    Node* next;
    Node* prev;
};

Node* head;
Node* tail;

public:
MyDLL();
~MyDLL();
void append(int);
void remove(int);
bool find(int) const;
void clear();
void print() const;
void reverse() const;
};

MyDLL::MyDLL()
{
head = nullptr;
tail = nullptr;
}
MyDLL::~MyDLL()
{
clear();
}

void MyDLL::append(int i)
{
    Node *n = new Node{ i, nullptr, nullptr };
if (head = nullptr)
{
    head = n;
    tail = n;
}
else
{
    n->prev = tail;
    tail->next = n; **<--- This is where the exception thrown error is showing up**
    tail = n;
}
}

void MyDLL::remove(int i)
{
Node* p = head;
Node* q = tail;

while (p != nullptr && p->i != i)
{
    q = p;
    p = p->next;
}

if (p = nullptr)
{
    return;
}

if (q = nullptr)
{
    head = p->next;
}
else
{
    q->next = p->next;
}

if (p->next = 0)
{
    tail = q;
}
else
{
    p->next->prev = q;
}
delete(p);
}

bool MyDLL::find(int i) const
{
Node* p = tail;

while (p != nullptr)
{
    if (p->i = i)
    {
        return (true);
    }
    p = p->prev;
}
return (false);
}

void MyDLL::clear()
{
while (tail != nullptr)
{
    Node* p = tail;
    tail = p->prev;
    delete (p);
}
head = nullptr;
}

void MyDLL::print() const
{
Node* p = head;

while (p)
{
    cout << p->i << "\t";
    p = p->next;
}
cout << "\n";
}

void MyDLL::reverse() const
{
Node* p = tail;

while (p)
{
    cout << p->i << "\t";
    p = p->prev;
}
cout << "\n";
}
#endif

int main()
{
    MyDLL list;
list.append(5);
list.append(6);
list.append(7);
list.append(8);

list.print();
list.reverse();
cout << system("pause");
}

2 个答案:

答案 0 :(得分:1)

此代码正是您要使用nullptr = tail而不是tail = nullptr的原因。特别是,每当您“检查” tail是否为空指针时,您都将nullptr分配给tail,然后Assign运算符返回一个值,该值随后隐式转换为布尔值,不会给您任何错误。但是错误实际上在那里。进行比较时,除非实际有分配和检查返回值的理由,否则将“ =”运算符替换为“ ==”即可。

答案 1 :(得分:-1)

请在代码中用 == 修复 =

void MyDLL::append(int i)
{
    Node *n = new Node{ i, nullptr, nullptr };
    if (head == nullptr)

始终建议您进行反向比较(nullptr == head)