【问题标题】:Doubly Linked List in C++ (Pointer being freed was not allocated)C ++中的双向链表(未分配被释放的指针)
【发布时间】:2021-07-19 09:40:44
【问题描述】:

谁能告诉我这里哪里出错了?我认为问题出在 clear() 函数上,但并不完全确定。目标是创建一个双向链表。我仍然需要添加一些功能,但感觉我已经添加了足够的功能来运行我在 main() 中提供的功能。

#include <iostream>
using namespace std;

template <class T>
class doubLList;

template <class T>
class doubNode{
    T data;
    doubNode<T>* next;
    doubNode<T>* prev;
public:
    doubNode(T data = T(), doubNode<T>* prev = nullptr, doubNode<T>* next = nullptr) : data(data),
    next(next), prev(prev) {}
    friend doubLList<T>;
    T& returnData() {return data;}
    doubNode<T>*& returnNext() {return next;}
};

template <class T>
class doubLList{
    doubNode<T>* head;
    doubNode<T>* tail;
public:
    doubLList() {head = new doubNode<T>; tail = new doubNode<T>; head->next = tail; tail->prev = head; cout<< "constructed" << endl;}
    doubLList(const doubLList<T>& copy);
    ~doubLList();
    doubLList<T>& operator=(const doubLList<T>& rhs);
    void clear();
    void insert(const T& data) {head->next = new doubNode<T>(data, head->next, head); head->next->next->prev = head->next;}
    doubNode<T>*& returnHead() {return head;}
};


template <class T>
void doubLList<T>::clear(){
    cout << "Clear" << endl;
    while(head->next != tail){
        cout << "Run" << endl;
        doubNode<T>* delNode = head->next;
        head->next = delNode->next;
        head->next->prev = head;
        delete delNode;
    }
}

template <class T>
doubLList<T>::doubLList(const doubLList<T>& copy){
    head = new doubNode<T>;
    tail = new doubNode<T>;
    head->next = tail;
    tail->prev = head;
    *this = copy;
}

template <class T>
doubLList<T>& doubLList<T>::operator=(const doubLList<T>& rhs) {
    if(this == &rhs){
        return *this;
    }
    clear();
    doubNode<T>* rhsPtr = rhs->next;
    while(rhs->next->next){
        tail->prev = new doubNode<T>(rhsPtr->data, tail, tail->prev);
        tail->prev->prev->next = tail->prev;
        rhsPtr = rhsPtr->next;
    }
}

template <class T>
doubLList<T>::~doubLList(){
    clear();
    delete head;
    delete tail;
    head = nullptr;
    tail = nullptr;
}



int main() {
    doubLList<int>test;

    cout << test.returnHead() << endl;

    test.insert(1);

    return 0;
}

提前致谢!

【问题讨论】:

  • 默认的构造函数和析构函数都不是很好。复制构造函数不是很好。你需要一步一步地把这些画出来。未初始化的指针和内存泄漏比比皆是。
  • void insert(const T&amp; data) -- 你在哪里插入新数据?在列表的末尾?在列表的开头?此外,该功能的实现看起来非常可疑。插入例程通常会遍历列表,而您的代码根本不这样做。如果不是这样,tail 将用于确定在最后插入的位置——同样,您的函数不会这样做。
  • 另外,如果 insert 实际上使用 tail 指针插入到列表的末尾以获得帮助,那么我建议您重写您的复制构造函数以简单地在循环中调用 insert(一次insert 正在工作)。这比你现在做的要容易得多。
  • head-&gt;next = new doubNode&lt;T&gt;(data, head-&gt;next, head) in insert 真的很混乱。为什么nextnexthead?您的 doubNode ctor 将 prev 作为第二个,next 作为第三个。
  • OP,如果您将新节点分配给 head-&gt;next,则它们不会出现在列表的前面。他们要去head-&gt;next,这是列表中的第二个位置。

标签: c++ pointers linked-list dynamic-memory-allocation doubly-linked-list


【解决方案1】:

以下提供了正确的实现:

改变了

doubNode(T data = T(), doubNode<T>* prev = nullptr, doubNode<T>* next = nullptr) : data(data),
    next(next), prev(prev) {}

doubNode(T data = T(), doubNode<T>* next = nullptr, doubNode<T>* prev = nullptr) : data(data),
    next(next), prev(prev) {}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    相关资源
    最近更新 更多