[英]If two pointers point to the same memory address, do you only need to use free(ptr) once or twice?
假设我们有一个结构......
struct node{
int data;
struct node *next;
};
struct node *new_node = malloc(sizeof(node));
struct node *temp_node = new_node;
如果我使用免费...
free(temp_node);
new_node 也是免费的(因为地址不再存在)还是 new_node 只是指向 NULL (在这种情况下我也需要释放 new_node)?
干杯!
您不会释放指针,而是释放您分配的 memory 块 - 指针指向其地址。
使用malloc
,它返回指向分配的 memory 块的指针,如下所示:
+--------+
| |
new_node --> | 0x1000 |
| |
+--------+
如果0x1000
是 memory 的那个块的起始地址,那就是new_node
指向的地址(即new_node == 0x1000
)。
当您将new_node
分配给temp_node
时, temp_node
指向 memory 的同一块(即temp_node == 0x1000
):
+--------+
| |
new_node --> | 0x1000 | <-- temp_node
| |
+--------+
但是您只分配了一块 memory。 因此,一旦您通过任一指针释放它,另一个将自动失效,并且您不再被允许通过任一指针访问该块。
同样,您可以将它分配给任意数量的指针,但只要它通过一个指针释放,它就完成了。 这就是为什么在复制指针时需要小心(因为如果你释放一个指针,它可能仍会被无意使用)。
PS:之后,Free'd 指针可能指向也可能不指向 NULL - 访问 free'd memory 只是未定义的行为。
有很多例外,但作为一般规则,每次调用malloc
都应该有一个free
调用。
当您将一个指针变量分配给另一个时,您是在复制指针值——您并没有分配更多的 memory。 因此,指针副本并不意味着需要第二次调用free
。
思考的方式是这样的:指针指向一个 memory 位置。 free()
返回由指向系统的指针指向的 memory。 因此,如果您有两个指针 - 一旦调用free
memory 将返回给系统。 你仍然有两个指针。 而且它们仍然指向相同的 memory 位置。 只是现在不是你的 memory 而是系统的:)
简而言之 - free
多次malloc
'd。
因为您正在释放 memory 而我在这里只看到一个malloc
,所以您应该只free()
一次。
一般来说,对于每个malloc
,必须有一个且只有一个free
。 否则,您将收到双重free
错误。
1个memory地址,只需要free
调用一次。
一旦你调用free
,就会告诉操作系统你分配的 memory 可以再次使用。 您不需要再次调用free
(也不应该,因为这是未定义的行为)。
关于代码的一些注释
struct *next
和struct *temp_node
指向一个没有实例的未命名结构。node
只是用于命名结构的结构标记,不能在这样的表达式中使用malloc(sizeof(node))
。如果这是您最初的意思:
struct node{
int data;
struct node *next;
};
struct node * new_node = malloc(sizeof(struct node));
struct node * temp_node = new_node;
那么这篇文章之前提供的答案是完全准确的。
#include<stdio.h>
#include<stdlib.h>
struct Node
{
int data;
struct Node * next;
}* first=NULL;
int main()
{
first=(struct Node *)malloc(sizeof(struct Node));
first->data=5;
first->next=NULL;
struct Node * t=first;
printf("%d",t->data);
free(first);
printf(" %d ",t->data);
}
在这种情况下,尽管First在 main 中被释放,然后也t打印数据。 这表示分配的 memory 块可以进一步用于不同的分配,但它仍然存在并且可以在指针指向它时使用。
但是如果进行了新的分配,那么 memory 块可以分配给另一个变量。 因此,在释放 memory 之后,它的行为是未定义的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.