我的链接列表实现是否泄漏了内存?

时间:2016-04-22 16:38:22

标签: c++ list memory-leaks dynamic-allocation

代码:

struct LinkedList {
    int someData;
    LinkedList* next;

    LinkedList() : next(0) {}
    ~LinkedList() {delete next;}
};

void someFunction() {
    LinkedList list;

    list.next = new LinkedList;
    list.next->next = new LinkedList;
    list.next->next->next = new LinkedList;
    // And so on...
}

我是否正确地说这段代码没有泄漏内存?当列表范围时,它应该调用它的析构函数,它调用next的析构函数,调用next的析构函数,依此类推,直到调用delete 0为止。

2 个答案:

答案 0 :(得分:5)

没有你的代码不会泄漏内存。当list超出范围时,它将被删除,连锁反应将删除每个下一个元素,直到最后一个元素。

但是,您的代码不尊重rule of 3。因此,只要您复制构造或复制分配LinkedList,其next指针就会被浅层复制。删除/销毁的两个副本中的第一个将删除它。另一个然后使用一个不再有效的指针,并将sonner或以后删除它,导致UB。

答案 1 :(得分:0)

如果您在调用delete时多次拨打new,那么您没问题。在这种情况下,会发生这种情况。

如果您在当前节点中,那么您应该保留指向下一个节点的指针,然后删除当前节点。

查看我在List (C)中的示例,您可以将malloc()视为new而将free()视为delete