繁体   English   中英

LinkedList析构函数中的分段错误

[英]Segmentation fault in LinkedList destructor

LinkedList::~LinkedList()
{
    Node *ptr = head;
    while (ptr->getNext() != nullptr) {
        Node *hold = ptr;
        ptr = ptr->getNext();
        delete hold;
    }
}

当实例化一个空的LinkedList对象时,在while循环的条件下出现了分段错误。 我还将在下面添加Node和LinkedList类cpp文件。

LinkedList.cpp

#include "LinkedList.h"

LinkedList::LinkedList()
{
    head = nullptr;
}

/** Make sure to dereference Node pointer when returning **/
Node* LinkedList::getNode(int e) {
    Node *ptr = head;
    while (ptr->getNext()) {
        if (ptr->getExponent() == e) {
            return ptr;
        }
        ptr = ptr->getNext();
    }
    return nullptr;
}

void LinkedList::addNode(int c, string b, int e) {
    Node *n = nullptr;
    *n = Node(c, b, e);
    if (!head) {
        head = n;
        return;
    }
    else if (n->getExponent() < n->getExponent()) {
        n->setNext(head);
        head = n;
    }
    else {
        Node *ptr = head;
        while (ptr->getNext()) {
            if (ptr->getNext()->getExponent() > n->getExponent()) {
                n->setNext(ptr->getNext());
                ptr->setNext(n);
                return;
            }
            ptr = ptr->getNext();
        }
        ptr->setNext(n);
    }
}

void LinkedList::deleteNode(int e) {
    if (!head) {
        return;
    }
    else if (head->getExponent() == e) {
        Node *hold = head;
        head = head->getNext();
        delete hold;
    }
    else {
        Node *ptr = head;
        while (ptr->getNext()) {
            if (ptr->getNext()->getExponent() == e) {
                Node *hold = ptr->getNext();
                ptr->setNext(ptr->getNext()->getNext());
                delete hold;
                return;
            }
            ptr = ptr->getNext();
        }
    }
}

string LinkedList::toString() {
    string line = "";
    Node *ptr = head;
    while (ptr->getNext()) {
        line += ptr->getTerm() + "";
        ptr = ptr->getNext();
    }
    return line;
}

void LinkedList::derive() {

}

LinkedList::~LinkedList()
{
    Node *ptr = head;
    while (ptr->getNext() != nullptr) {
        Node *hold = ptr;
        ptr = ptr->getNext();
        delete hold;
    }
}

Node.cpp

#include "Node.h"
#include <string>
#include <sstream>

using namespace std;

Node::Node() {
    coefficient = 0;
    base = "";
    exponent = 0;
    next = nullptr;
}

Node::Node(int c, string b, int e) {
    coefficient = c;
    base = b;
    exponent = e;
    next = nullptr;
}

string Node::getTerm() {
    stringstream term;
    term << coefficient << base << "^" << exponent;
    return term.str();;
}

Node::~Node() {}

是的,我知道这并非您的确切做法,我可能会给您错误的建议,但是,如果您提出:

~Node() { delete getNext(); }
~LinkedList () { delete head; }

然后是一个从列表中选择一个特定节点并为前一个节点提供下一个节点的引用的函数,那么您就不必进行所有复杂的工作,例如取消对nullptr的引用。

/!\\当然,在这种情况下,您必须设置要删除的节点:

node_you_want_to_remove->next=nullptr;

(请阅读下面的评论以获取更多说明)

好吧,那只是我的意见,如果我错了,我很高兴被解释为什么。

祝你有美好的一天。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM