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

时间:2016-09-21 03:08:45

标签: c++ pointers destructor

当我删除链表中的节点时,是否需要将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,则无法再次找到此内存。

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

2 个答案:

答案 0 :(得分:1)

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

ListNode的成员变量都不具有析构函数,因此ListNode的默认析构函数不执行任何操作。

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

答案 1 :(得分:0)

  

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

默认析构函数会破坏成员变量。如果成员变量具有用户定义的析构函数,则调用它们。如果它们是基本类型,则没有任何反应。

除此之外还有更多内容。阅读标准中关于析构函数的部分是值得的。在C ++ 11中,该部分是12.4。您还可以在cppreference.com找到更多信息。