不,你实际上没有这样做。
然而,几乎所有代码都应该以这样一种方式编写,即当拥有它的对象超出范围时数据会被删除,因此这将(几乎)不可避免地发生。
换句话说,你应该不通常有类似的东西:
// WARNING: bad code. Avoid this, or anything similar.
struct node {
int data;
struct node *next;
};
node *head = NULL;
int main() {
node *t = new node;
t->data = 1;
t->next = head;
head = t;
t = new node;
t->data = 2;
t->next = head;
head = t;
// here, do we bother to delete the two nodes or not?
};
相反,您通常想要做的是创建一个封装所有工作的类,并在其析构函数中释放它拥有的所有内存:
class linked_list {
struct node {
int data;
node *next;
node(int data, node *next = NULL) : data(data), next(next) {}
} *root;
public:
void add(int data) {
root = new node(data, root);
}
~linked_list() {
node *prev = root;
for (node *temp = prev->next; temp!=NULL; temp=temp->next) {
delete prev;
prev = temp;
}
delete prev;
}
};
有了这样的课程,真的不需要做决定:
int main() {
linked_list x;
x.add(1);
x.add(2);
}
当执行到达定义x 的块的末尾时,x 超出范围并被销毁。在这个过程中,它的析构函数被调用,并删除了链表中的节点(当然,以我的代码中的任何错误为模)。在这种情况下,无需考虑或关心删除节点是否有意义,因为它每次都会自动发生。
请注意,我也不是说这段代码(甚至接近)100% 理想。使用足够现代的编译器来支持它,您几乎肯定希望它成为允许存储任意类型的模板,并使用unique_ptr 和make_unique 而不是原始指针和原始new。不幸的是,我别无选择,只能将这些排除在外,因为我确信 Turbo C++ 不支持unique_ptr,并且怀疑它是否也支持模板。对于实际使用,这还应该包括一个复制构造函数和赋值运算符,因此分配和复制链表将正常工作(就目前而言,这通常会导致问题,因为它最终会试图破坏节点链表两次)。
最后一点:当然,您通常不应该编写自己的链表代码。但是,当/如果您确实有理由编写容器(或类似的东西)时,它应该清理自己的烂摊子,可以这么说。 C++ 的真正优势之一是确定性破坏。使用它。