[英]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.