链接列表中的内存泄漏

时间:2016-05-18 02:09:57

标签: c++ memory-leaks

我已经研究了好几天了,我找不到导致内存泄漏的原因?我是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;
    };

1 个答案:

答案 0 :(得分:1)

  

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

除了你在clear()中没有做任何类似的事情。在自定义链接列表类上调用clear()将泄漏已分配的所有内存。

如果您的泄漏代码未使用clear(),则需要修改问题并添加Minimum, Complete, and Verifiable example