默认析构函数是否释放成员指针指向的内存?

Does default destructor free the memory pointed by the member pointers?

删除链表中的节点时,是否需要将next设置为NULL?

ListNode 定义为这样

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x): val(x) {}
}

现在我想删除m

之后的节点
ListNode *tmp = m->next;
m->next = m->next->next;
delete tmp;

如果在析构函数中删除tmp->next,链表应该有问题。但是,如果不删除tmp->next,可能还有一种情况会导致内存泄漏:

ListNode *tmp = new ListNode(0);
tmp->next = new ListNode(1);
delete tmp;

如果tmp->next不删除,就没有办法再找到这块内存了

所以这是一个难题,默认析构函数实际上做了什么?

默认析构函数会销毁所有成员变量(具有析构函数的)并且不执行任何其他操作。

None of ListNode 的成员变量有析构函数,所以 ListNode 的默认析构函数什么都不做。

请注意,虽然 next 是一个成员变量,但 next 指向的不是。

So it's a dilemma here, what does the default destructor actually do?

默认析构函数销毁成员变量。如果成员变量具有用户定义的析构函数,则调用它们。如果它们是基本类型,则什么也不会发生。

它比我上面描述的要多。阅读标准中有关析构函数的部分将是值得的。在 C++11 中,该部分是 12.4。您还可以在 cppreference.com.

找到更多信息