代码:
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为止。
答案 0 :(得分:5)
没有你的代码不会泄漏内存。当list
超出范围时,它将被删除,连锁反应将删除每个下一个元素,直到最后一个元素。
但是,您的代码不尊重rule of 3。因此,只要您复制构造或复制分配LinkedList
,其next
指针就会被浅层复制。删除/销毁的两个副本中的第一个将删除它。另一个然后使用一个不再有效的指针,并将sonner或以后删除它,导致UB。
答案 1 :(得分:0)
如果您在调用delete
时多次拨打new
,那么您没问题。在这种情况下,会发生这种情况。
如果您在当前节点中,那么您应该保留指向下一个节点的指针,然后删除当前节点。
查看我在List (C)中的示例,您可以将malloc()
视为new
而将free()
视为delete
。子>