簡體   English   中英

C: realloc 如何處理它釋放的內存?

[英]C: what does realloc do with memory that it frees up?

我有一個玩具 C 程序,它使用mallocrealloc來分配然后釋放內存:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *ptr, i , n1, n2;
    printf("Enter size: ");
    scanf("%d", &n1);

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

    printf("Addresses of previously allocated memory: ");
    for(i = 0; i < n1; ++i)
         printf("%p\n",ptr + i);

    printf("\nEnter the new size: ");
    scanf("%d", &n2);

    // rellocating the memory
    ptr = realloc(ptr, n2 * sizeof(int));

    printf("Addresses of newly allocated memory: ");
    for(i = 0; i < n2; ++i)
         printf("%p\n", ptr + i);
  
    printf("%d\n", *(ptr + n2 + 1));

    free(ptr);

    return 0;
}

它需要一個大小,它分配的n1 ,然后它重新分配的大小n2 該程序還假設n1 > n2打印出ptr + n2 + 1處的值,只是為了查看釋放的內存設置為什么。

在我的 Mac 上,使用cc ,我從printf("%d\\n", *(ptr + n2 + 1)); 0

那是特定於編譯器的嗎? realloc 是否總是在重新分配后將不再使用的內存設置為 0?

是的,它是特定於編譯器的。 僅僅取消引用已被重新realloc的指針在標准 C 中是未定義的行為,因此當然不能保證那里可能有什么值,如果你看到一個。

事實上,我什至懷疑您的編譯器是否有意將此內存歸零,除非您已設置調試選項來請求這樣做。 許多 malloc 實現將它們自己的簿記數據存儲在已釋放的塊中,並且在這種特殊情況下,存儲在該位置的簿記數據可能恰好為零。 但是系統地清零釋放的內存(將被進程重用)通常會浪費 CPU 周期,因為用戶的代碼不應該再次訪問該內存,因此通常不會這樣做。

實際上,現在我查看了您的代碼,您一開始就沒有在分配的塊中寫入任何內容。 所以很可能它一直包含零。 操作系統新分配的內存被清零是正常的(這確保它不包含來自其他進程的敏感數據),因此如果 malloc 的內存直接來自操作系統而不是來自以前的內存,有時會被清零釋放塊。

暫無
暫無

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

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