C 語言中的 maclloc free()
在幾乎所有的情況下, C 語言都可以自動的來分配內存,這不需要你的參與。這很高效,也很安全。這也是目前主流語言所采取的策略。但是 C 語言除了系統自動分配和回收內存,還可以自己手動來分配和回收內存,讓你的程序更具有靈活性。
1. 動態分配內存
int *x;
x = (int *)maclloc(32);
maclloc
函數的參數是分配的內存的大小,這個值我們也可以根據不同變量類型通過 sizeof
這個函數來獲得。其返回值是一個無類型的指針。所以這里我們用了顯示的類型轉換,將其轉換與指針變量類型相同的指針。
2. 回收動態分配的內存
回收動態分配的內存需要傳入指針變量即可。
free(x);
這樣就釋放了我們之前動態分配的內存空間。
3. 示例程序
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *x;
printf("x value: %p, x address: %p, *x value: %d\n", x, &x, *x);
x = (int *)malloc(sizeof(x));
printf("x value: %p, x address: %p, *x value: %d\n", x, &x, *x);
*x = 10;
printf("x value: %p, x address: %p, *x value: %d\n", x, &x, *x);
free(x);
return 0;
}
運行結果:
x value: 0x7fffeac6bd50, x address: 0x7fffeac6bc60, *x value: 1
x value: 0x7fffe3916270, x address: 0x7fffeac6bc60, *x value: 0
x value: 0x7fffe3916270, x address: 0x7fffeac6bc60, *x value: 10
程序中聲明了一個整數型的指針,然后對這個指針分配了一塊內存。把這個分配好的內存地址給了指針變量。然后對這個地址所表示的變量進行賦值。最后再回收分配的內存。
4. 小結
動態內存分配可以說是 C 語言程序員的噩夢。我們可能會遇到如果分配了內存,但是在最后沒有回收內存。這種情況就如同內存空洞存在,會不斷的使系統的可用內存減少,因此稱之為內存泄露。這是非常常見的內存分配的錯誤。很多著名的軟件也都會存在這種問題。最簡單的解決辦法就是通過定期重啟程序來解決。還有一種常見錯誤就是使用沒有成功分配的內存地址。這也會引起莫名的錯誤。
同時使用分配內存的函數會消耗一定的資源,因為這會讓 C 語言調用與系統之間的 API ,會拖慢程序的運行。大量的調用會產生性能問題。
所以在進行涉及計算機或者其他設備硬件資源操作的時候,一定要謹慎。因為這些資源是有限的,一旦被占用了,可利用的資源數量就會減少。直至資源的耗盡。