如果我的代码如下:
struct ListNode{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* delete_first_node(ListNode* head){
ListNode** pp = &head;
*pp = (*pp)->next;
return *pp;
}
C ++将如何释放"头节点"功能是否已处理?
答案 0 :(得分:4)
函数名称具有误导性,它应该只是名为get_next
,因为它不会delete
任何东西。它只是以混淆的方式返回head->next
。
如果要管理(自动)内存,则必须更改为:
struct ListNode{
int val;
std::unique_ptr<ListNode> next;
explicit ListNode(int x) : val(x), next(nullptr) {}
};
void pop_front(std::unique_ptr<ListNode>& head){
if (head == nullptr) {
return; // or error
}
head = std::move(head->next); // will do the delete for you
}
并使用它
std::unique_ptr<ListNode> head = std::make_unique<ListNode>(42);
// ... fill list as
// head->next = std::make_unique<ListNode>(21);
pop_front(head);
答案 1 :(得分:0)
C ++通常不会自己清除内存,我们应该自己做。
ListNode** pp = &head;
*pp = (*pp)->next;
在上面的代码中,您只是将头部位置移动到下一个。
而不是*pp = (*pp)->next;
你应该重置头部位置,比如,
head = pp->next; -> move the head to next position
and then delete pp;-> this will delete the memory of the deleted node.
请注意语法,只是它是伪代码。