我的链表实现是否泄漏内存



代码:

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。

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

但是,您的代码不遵循 3 规则。 因此,一旦您将复制构造或复制分配LinkedList,其next指针将被浅复制。 删除/销毁的两个副本中的第一个将删除它。 然后,另一个指针使用不再有效的指针,并且也会发出谐振或稍后将其删除,从而导致 UB。

如果你叫delete的次数和new被叫的次数一样多,那么你就没问题了。在这种情况下,会发生这种情况。

如果您位于当前节点中,则应保留指向下一个节点的指针,然后删除当前节点。

请参阅我在列表(C)中的一个例子,您可以在其中"认为"malloc() newfree()视为delete

最新更新