C ++ SLList-从堆中删除临时节点?

时间:2018-11-07 21:59:24

标签: c++ list memory

我正在学习链表,我认为必须用new回答每个delete才能清除动态分配的内存。这是我的代码,在列表中创建3个节点,每次在temp函数中使用Node *temp = new Node;创建一个createNode节点。我的问题是,这不是在堆上动态分配吗,我是否需要delete temp;?没有它,我的代码运行良好,但是当我在函数末尾添加delete temp;时,会出现读取访问冲突错误。函数结束后现在不再使用temp了,这不应该有所作为吗?希望有道理,谢谢您的帮助。

#include <iostream>
#define Log(x) std::cout << x << std::endl;

struct Node
{
    int data;
    Node *next;
};

class SLList
{
private:
    Node *head;
    Node *tail;

public:
    SLList() 
    {
        head = NULL;
        tail = NULL;
    }

    void createNode(int value)
    {
        Node *temp = new Node;
        temp->data = value;
        temp->next = NULL;

        if (head == NULL)
        {
            head = temp;
            tail = temp;
        } 
        else
        {
            tail->next = temp;
            tail = temp;
        }
    }

    void printList()
    {
        Node *temp;
        temp = head;
        while (temp != NULL)
        {
            Log(temp->data);
            temp = temp->next;
        }
    }
};

int main()
{
    SLList list1;
    list1.createNode(5);
    list1.createNode(7);
    list1.createNode(2);

    list1.printList();

    std::cin.get();
}

2 个答案:

答案 0 :(得分:2)

确实应该释放动态分配的内存,但是您尝试在错误的时间这样做。

调用Node *temp = new Node;时,您不会创建临时节点,而是在堆上创建节点,并在堆栈上创建指向该节点的临时指针。在将该节点添加到列表中之后,您不再需要该指针(其值存储在SList对象中),但是仍然需要它指向的对象。

所以:

  • 是的,您应该通过调用Delete释放内存
  • 否,您不得在createNode方法内进行操作,因为您仍然需要此数据。在不需要时释放内存:从列表中删除元素。

答案 1 :(得分:0)

每个delete的{​​{1}}是正确的,但是没有告诉您何时删除。当您拥有指向数据的指针并且打算稍后使用这些指针值取消引用它们时,您将无法删除。

指向节点的指针位于列表中和头部指针中,因此您尚不能删除这些节点。只有在为给定节点分配了新值之前,将清除或清除指向给定节点的任何指针时,才可以这样做。