【问题标题】:Does default destructor free the memory pointed by the member pointers?默认析构函数是否释放成员指针指向的内存?
【发布时间】:2017-01-29 03:13:23
【问题描述】:

删除链表中的节点时,是否需要将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没有被删除,那段内存就再也找不到了。

所以这里进退两难了,默认析构函数到底做了什么?

【问题讨论】:

  • 不会在成员指针上调用delete
  • 默认析构函数如何知道是否释放该内存?甚至不能保证该内存是动态分配的。

标签: c++ pointers destructor


【解决方案1】:

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

ListNode 的所有成员变量都没有析构函数,因此ListNode 的默认析构函数什么都不做。

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

【讨论】:

  • 这是否意味着我应该删除 tmp->next 或在删除 tmp 之前再给它一个指针?
  • @KingstonChan 您已经掌握了回答该问题所需的信息。你觉得有吗?
  • 谢谢!你很有帮助!
  • @KingstonChan 你觉得可以吗?
  • 是的,我想是的。
【解决方案2】:

所以这里进退两难了,默认析构函数到底做了什么?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2020-07-24
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2017-07-27
    • 2015-07-28
    相关资源
    最近更新 更多