[英]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)
。 即,指針被取消引用並且指向無處。 這意味着指針所指向的內存將被有效擦除。
這個問題分為兩部分:
dummyPtr
似乎仍然指向內存中的地址,而不是(nil)
。 為什么? ptr
怎樣? 它是否仍指向該內存塊或是否也已取消引用? 我已經運行了這段代碼和一些變體幾次,但結果相互矛盾。 有時只影響副本,有時兩者都受影響。 有時,指向的值甚至設置為零!
坦白說,我不知道發生了什么。 (如果正在運行,我正在運行Debian。)
free
不會將指針設置為NULL,也不會擦除任何內存。 相反,它會將指針指向的內存塊標記為空閑(即未分配)。
在調用free(dummyPtr)
, ptr
和dummyPtr
現在都是無效的指針,因為它們不指向已分配的內存塊。
您的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.