链接列表中的内存泄漏

Memory Leaks in link list

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

我已经为此工作了好几天,但我找不到这是为什么会导致内存泄漏?我刚接触C++,有人能向我解释一下我做错了什么吗。我不断调用pop(),直到析构函数中的根节点为null,直到列表为空,这应该对对象调用delete。

 #pragma once
    template<typename T>
    class LinkList
    {
    public:
        class LinkNode
        {
        public:
            LinkNode() : next(nullptr)
            {
            }
            bool operator!=(LinkNode *a_node)
            {
                return (this->data != a_node->data);
            }
            bool operator==(LinkNode *a_node)
            {
                return (this->data == a_node->data);
            }
            void operator=(LinkNode *a_node)
            {
                this->data = a_node->data;
                this->next = a_node->next;
            }   
            T data;
            LinkNode* next;
        };
        class LinkIterator
        {
        public:
            LinkIterator(LinkNode* a_root) : node(a_root)
            {
            }
            ~LinkIterator()
            {
            }
            T& operator*()
            {
                return this->node->data;
            }
            void operator++() //Prefix
            {
                this->node = this->node->next;
            }
            void operator++(int) //Postfix
            {
                this->node = this->node->next;
            }
            bool operator!=(LinkIterator a_linkIterator)
            {
                return (node != a_linkIterator.node);
            }
            bool operator==(LinkIterator a_linkIterator)
            {
                return (node != a_linkIterator.node);
            }
            LinkNode* node;
        };
        LinkList() : size(0), root(nullptr), lastNode(nullptr)  
        {
        }
        ~LinkList()
        {
            while (root != nullptr)
            {
                pop();
            }
        }
        LinkIterator begin()
        {
            return LinkIterator(root);
        }
        LinkIterator end()
        {
            return nullptr;
        }
        void push(T a_data)
        {
            LinkNode* node = new LinkNode;
            node->data = a_data;
            node->next = nullptr;
            if (lastNode != nullptr)
            {
                lastNode->next = node;
                lastNode = node;
            }
            else
            {
                root = node;
                lastNode = node;
            }
            size++;
        }
        void pop()
        {
            if (root->next == nullptr)
            {
                delete root;
                root = nullptr;
            }
            else
            {
                LinkNode *prevNode = root;
                while (prevNode->next != nullptr && prevNode->next != lastNode)
                {
                    prevNode = prevNode->next;
                }
                delete lastNode;
                prevNode->next = nullptr;
                lastNode = prevNode;
            }
            if (size != 0)
                size--;
        }
        int getSize()
        {
            return size;
        }
        void push_front(T a_data)
        {
            LinkNode *node = new LinkNode;
            node->data = a_data;
            node->next = nullptr;
            if (root != nullptr)
            {
                node->next = root;
                root = node;
            }
            else
            {
                root = node;
                lastNode = node;
            }
            size++;
            node = nullptr;
        }
        void pop_front()
        {
            LinkNode *temp = root;
            root = root->next;
            delete temp;
            if (size != 0)
                size--;
        }
        void clear()
        {
            root = nullptr;
            size = 0;
        }
        bool empty()
        {
            return (size == 0);
        }
        T& front()
        {
            return root->data;
        }
        T& back()
        {
            return lastNode->data;
        }
        void insert(T a_data, unsigned int index)
        {
            if (index <= size)
            {
                LinkNode* position = root;
                for (unsigned int i = 0; i < index -1; i++)
                {
                    position = position->next;
                }
                LinkNode *node = new LinkNode;
                node->data = a_data;
                node->next = position->next;
                position->next = node;
            }
            else if(size == 0)
            {
                root->data = a_data;
            }
            else
            {
                push(a_data);
            }
        }
    private:
        unsigned int size;
        LinkNode* root;
        LinkNode* lastNode;
    };

我不断调用pop(),直到列表为空删除对象。

除了你在clear()中什么都不做。在自定义链接列表类上调用clear()会泄漏所有已分配的内存。

如果您的泄漏代码不使用clear(),则需要编辑您的问题,并包含一个Minimum、Complete和Verifible示例。