2016-09-21 117 views
0

当我删除链接列表中的节点时,是否需要将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不会被删除,没有办法再次找到了这块内存。

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

+0

它不会调用删除成员指针 –

+0

默认析构函数可能知道是否释放该内存?不能保证内存甚至是动态分配的。 – AnT

回答

1

默认的析构函数销毁所有成员变量(它具有析构函数)并且什么也不做。

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

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

+0

那么这是否意味着我应该删除'tmp-> next'或在删除'tmp'之前给它另一个指针? –

+0

@KingstonChan你已经有了你需要的信息来回答这个问题。你认为它确实吗? – immibis

+0

谢谢!你非常有帮助! –

0

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

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

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