链表泄漏

Linked list leaks?

本文关键字:泄漏 链表      更新时间:2023-10-16

我不太精通C++,但我的任务是设计和实现链表。这是我提交的:

template <typename T>
struct Node
{
    Node() : next(nullptr) {}
    Node(T const & val) : next(nullptr), value(val) {}
    Node * next;
    T value;
};
template <typename T>
class LinkedList
{
    public:
        LinkedList()
        {
            begin_ = new Node<T>;
            current_ = begin_;
        }
        ~LinkedList()
        {
            delete begin_;
        }
        void insert(T const & value)
        {
            Node<T> * node = new Node<T>(value);
            node->next = current_->next;
            current_->next = node;
            current_ = current_->next;
        }
        void remove()
        {
            Node<T> * tmp = current_->next;
            if(!end())
            {
                current_->next = current_->next->next;
            }
            delete tmp;
        }
        bool end() const
        {
            return current_->next == nullptr;
        }
        void reset()
        {
            current_ = begin_;
        }
        void advance()
        {
            if(!end())
            {
                current_ = current_->next;
            }
        }
        T get() const
        {
            return current_->next->value;
        }
    private:
        Node<T> * begin_;
        Node<T> * current_;
};

我通过了作业,但我的老师在析构函数~LinkedList()中划线delete begin_,并在旁边写下"这泄漏!我一直在想delete begin_怎么可能泄漏,但我仍然不明白。有人可以帮我吗?

您必须遍历列表中的每个节点并删除。 按住指向下一个的单独指针,删除当前指针,然后向前移动并继续删除,直到下一个指针为 null。

~LinkedList()
{
    Node * current = begin_;
    Node * aNext = begin_->next;
    while (null != aNext){
        delete(current);
        current = aNext;
        aNext = current->next;
    }
}

像这样的东西。 不知道你从哪里得到begin_,但是......

在 Node 的析构函数中,它应该将 delete 命令发送到 next,以便释放列表中的所有节点。

我想你会这样更好地理解它:

~LinkedList()
{
  reset();
  while(!end()) remove();
}