簡體   English   中英

釋放指向C中已分配內存的指針的副本

[英]Freeing a copy of a pointer to malloc'd memory in C

似乎在其他地方找不到我的問題的答案。

考慮一下代碼:

int *ptr = malloc (sizeof (*ptr));

int *dummyPtr = ptr;

free (dummyPtr);

printf ("ptr: %p, dummy: %p\n", ptr, dummyPtr);

據我了解, free()接受一個指針,並使其指向NULL aka (nil) 即,指針被取消引用並且指向無處。 這意味着指針所指向的內存將被有效擦除。

這個問題分為兩部分:

  1. 如果我運行上面的代碼, dummyPtr似乎仍然指向內存中的地址,而不是(nil) 為什么?
  2. ptr怎樣? 它是否仍指向該內存塊或是否也已取消引用?

我已經運行了這段代碼和一些變體幾次,但結果相互矛盾。 有時只影響副本,有時兩者都受影響。 有時,指向的值甚至設置為零!

坦白說,我不知道發生了什么。 (如果正在運行,我正在運行Debian。)

free不會將指針設置為NULL,也不會擦除任何內存。 相反,它會將指針指向的內存塊標記為空閑(即未分配)。

在調用free(dummyPtr)ptrdummyPtr現在都是無效的指針,因為它們不指向已分配的內存塊。

您的printf行使用無效的指針導致未定義的行為。 當發生未定義的行為時 ,所有賭注都關閉。


標准參考:C11 6.2.4 / 2

當指針所指向的對象(或剛過去的對象)達到其生命周期的終點時,指針的值將變得不確定。

附件J.2:

在以下情況下,行為是不確定的:

  • 具有自動存儲持續時間的對象的值在不確定時使用

free()函數釋放ptr指向的內存空間,該內存空間必須已由先前對malloc(),calloc()或realloc()的調用返回。 否則,或者如果之前已經調用過free(ptr),則會發生未定義的行為。 如果ptr為NULL,則不執行任何操作。

您從何處獲得了free將指針設置為NULL呢? 如果您想重用指針,那就是您的工作。 如果您不重用它,則它所指向的位置沒有任何區別。

要了解,請查看free()的原型

void free(void *ptr)

即使該函數希望將函數的ptr更改為指向NULL,也無法將其更改為空,因為ptr只是復制到該函數中,因此只能釋放ptr指向的內容。

為了自由更改,它需要一個原型,例如

void free(void **ptr)

一旦使用ptr指向的內存在指針上調用了free,則該行為是未定義的行為,因為該內存已返回給OS。

Dummyptr仍然保留舊的內存位置。 釋放之后,prt和dummyptr都將耗盡,不應取消引用,因為這將導致不確定的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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