代码:
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()
new
,free()
视为delete
。