簡體   English   中英

釋放等於malloc指針的指針

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

mallocfree不了解您的數據結構。 他們所知道的只是字節的斑點。

通常,您的mallocfree調用之間應該存在一對一的關系。 (有很多例外,但這是一個很好的一般規則。)

從來沒有一次調用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.

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