[英]C: what does realloc do with memory that it frees up?
我有一個玩具 C 程序,它使用malloc
和realloc
來分配然后釋放內存:
#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.