无法在函数结束时释放内存



我创建了一个函数,在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的内存,以避免内存泄漏。

您必须遵循以下操作顺序:

  • 创建节点
  • 使用节点
  • 空闲节点

您不能执行以下操作。它不起作用:

  • 创建节点
  • 空闲节点
  • 使用节点(释放内存后无法执行此操作)

相关内容

  • 没有找到相关文章

最新更新