簡體   English   中英

如果兩個指針指向同一個memory地址,是只需要使用free(ptr)一次還是兩次?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM