默认析构函数是否释放成员指针指向的内存?
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.
找到更多信息
删除链表中的节点时,是否需要将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.
找到更多信息