我创建了一个函数,在c++中的链表前面附加一个节点。如果我不评论最后一行,即删除临时行,程序将运行到一个无限循环中,但如果我评论它,一切都会正常运行。我希望释放分配给指针temp的内存,以避免内存泄漏。为什么会引起问题?
void addFront(Node **head, int item)
{
Node *temp = new Node(); // Allocating new memory.
temp->data = item; //Storing data in the node.
temp->next = *head; //Linking temp pointer to head pointer.
*head = temp; //Resetting the head pointer as the new first node.
//delete temp; //Deallocating memory.
}
您调用了一次'new',所以只分配了一次节点。没有必要";避免泄漏";因为您从未复制过节点。
不要将指针与指针对象混淆。delete temp
删除temp
指向的对象,但这是您刚刚插入树中的节点。您不需要手动管理指针本身的内存,因为它使用自动存储。
new Node();
所做的不仅仅是分配内存。它通过调用其构造函数来分配内存并创建一个Node
。应该通过调用构造函数来初始化成员,而不是两个阶段的构造。
略有修改的评论:
void addFront(Node **head, int item)
{
Node *temp = new Node(item,*head); // create new node. temp is a pointer to it
*head = temp; // head points to the new node
//delete temp; // delete the new node ?!?
}
没有内存泄漏,因为现在*head
确实指向新创建的节点。
这是内存泄漏:
void foo() {
int* x = new int;
}
因为函数返回后,您无法访问CCD_ 6,也无法释放其内存。虽然这不是内存泄漏:
void bar() {
int * x;
}
如上所述,x
本身使用自动存储,当函数返回时,其内存会自动释放。我们常说:x
是在堆栈上分配的。
为什么会引起问题?
如果函数的目的是添加一个新节点,那么函数之后的节点应该比调用函数之前的节点多。
如果创建一个节点并将其删除,那么函数之后的节点将不会比以前多。这与所描述的后编码相矛盾,即应该有比以前更多的节点。
你还没有显示程序中执行此操作的部分,但可能是在创建列表后以某种方式使用了该列表。你不能使用已经删除的节点。
如果我不评论最后一行,即删除临时行,程序将进入无限循环
删除节点是修复未显示的无限循环的错误方法。
我希望释放分配给指针temp的内存,以避免内存泄漏。
您必须遵循以下操作顺序:
- 创建节点
- 使用节点
- 空闲节点
您不能执行以下操作。它不起作用:
- 创建节点
- 空闲节点
- 使用节点(释放内存后无法执行此操作)