[英]Free a pointer equal to a malloc pointer
我在理解某些free()行為時遇到了麻煩。
int* ptr1 = (int*)malloc(sizeof (int)*10);
int* ptr2 = ptr1;
free(ptr2);
free(ptr2)
會根據需要刪除我的數組?
如果我該怎么辦:
int** ptr1 = (int**)malloc(sizeof (int)*10);
int* ptr2 = (int*)malloc(sizeof (int));
*ptr2 = 10;
ptr1[0] = ptr2;
free(ptr1);
此代碼正確嗎? free(ptr1)
也會刪除ptr2的空間嗎?
謝謝
是和否。
另請注意, malloc(sizeof(int)*10);
在第二個示例中可以使用,但不一定會為十個指針分配空間。
為了解釋在第一個示例中發生的情況,在分配給ptr2
之后,您將獲得以下內容:
+------+ | ptr1 | ---\ +------+ \ +----------------------------+ >---> | memory allocated by malloc | +------+ / +----------------------------+ | ptr2 | ---/ +------+
這兩個變量包含相同的值,即malloc
返回的指針,因此您可以使用它們之一來訪問分配的內存。
對於第二個問題,您所擁有的是這樣的:
+---------+---------+---------+-----+ | ptr1[0] | ptr1[1] | ptr1[2] | ... | +---------+---------+---------+-----+ | | v +----------------------------+ | memory allocated by malloc | +----------------------------+ ^ | | +------+ | ptr2 | +------+
當您釋放內存指針ptr1
,只有釋放內存,內存指向ptr2
仍然存在且可通過ptr2
。
malloc
和free
不了解您的數據結構。 他們所知道的只是字節的斑點。
通常,您的malloc
和free
調用之間應該存在一對一的關系。 (有很多例外,但這是一個很好的一般規則。)
從來沒有一次調用free
會同時釋放兩次調用malloc
分配的兩個單獨的塊。
因此,正如其他人所說,您的問題的答案是“是”和“否”。
int* ptr1 = (int*)malloc(sizeof(int)*10);
int* ptr2 = ptr1;
free(ptr2);
很好, ptr2
包含與ptr1
相同的值,因此您傳遞給malloc()
的內存為free()
d。
int** ptr1 = (int**)malloc(sizeof(int)*10);
int* ptr2 = (int*)malloc(sizeof(int));
*ptr2=10;
ptr1[0]=ptr2;
free(ptr1);
那不好 您正在將ptr2
的值存儲在ptr1
數組中,但沒有釋放它。 你要:
int** ptr1 = (int**)malloc(sizeof(int*)*10);
int* ptr2 = (int*)malloc(sizeof(int));
*ptr2=10;
ptr1[0]=ptr2;
...
free(ptr1[0]);
free(ptr1);
注意,我還更改了malloc()
以分配10個指向int
指針,而不僅僅是分配10個int
(其大小可能不相同)。
最后請注意,您不需要在C中malloc()
的返回值 。我沒有為您解決此問題,因為它本身不是問題,並且與您的問題無關,但是(可以說)不好樣式。
free(ptr2)是否會根據需要刪除我的數組?
我認為delete
一詞在這里不能使用。 GNU手冊說:
當不再需要使用malloc獲得的塊時,請使用free函數使該塊可再次分配。
但是free不會將指針自動設置為NULL,因為函數返回類型本身為void
。 也,
釋放一個塊會改變該塊的內容。 釋放數據后,不要期望在該數據塊中找到任何數據(例如,指向鏈中下一個塊的指針)。
我並沒有引發關於是否應在釋放指針后將其設置為NULL的爭論。 但是,我很想發布這個崩潰和燒傷的示例:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* ptr1 = malloc(sizeof(int)*10);
int* ptr2 = ptr1;
free(ptr2);
if(ptr2!=NULL)
{
printf("ptr is %p\n",ptr2); // still printf
printf("Enter a number for ptr2 :");
scanf("%d",ptr2);
printf("Value pointed to by ptr2 : %d\n",*ptr2);
printf("Value pointed to by ptr1 : %d\n",*ptr1);
}
else
printf("Ptr2 pointed to null");
printf("Size of ptr1 : %d\n",sizeof(ptr1));
if(ptr1==NULL)
printf("ptr1 NULL\n");
printf("Enter a number for ptr1 :");
scanf("%d",ptr1);
printf("Value pointed to by ptr1 : %d\n",*ptr1);
printf("Value pointed to by ptr2 : %d\n",*ptr2);
free(ptr1);
if(ptr1==NULL)
printf("ptr1 freed\n");
return 0;
}
產量
ptr is 0x1c92010
Enter a number for ptr2 :4
Value pointed to by ptr2 : 4
Value pointed to by ptr1 : 4
Size of ptr1 : 8
Enter a number for ptr1 :1
Value pointed to by ptr1 : 1
Value pointed to by ptr2 : 1
*** glibc detected *** ./testp: double free or corruption (fasttop): 0x0000000001c92010 ***
Segmentation fault (core dumped)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.