C 釋放記憶體
釋放(free)記憶體
當您不再需要一塊記憶體時,應該釋放它。釋放記憶體也稱為“free”記憶體。
動態分配的記憶體會一直保留,直到被釋放或者程式結束。
一旦記憶體被釋放,它可以被其他程式使用,或者甚至可以被分配給您程式的另一部分。
釋放記憶體
要釋放記憶體,請使用 free()
函式
free(pointer);
pointer 引數是指向要釋放的記憶體地址的指標
int *ptr;
ptr = malloc(sizeof(*ptr));
free(ptr);
ptr = NULL;
將指標設定為 NULL
是一個好習慣,這樣可以防止您意外地繼續使用它。
如果您在釋放記憶體後繼續使用該記憶體,可能會損壞其他程式的資料,甚至是您自己程式中的另一部分資料。
示例
包含錯誤檢查和釋放的實際示例
int *ptr;
ptr = malloc(sizeof(*ptr)); // 為一個整數分配記憶體
// 如果記憶體分配失敗,則列印一條訊息並結束 main() 函式
if (ptr == NULL) {
printf("無法分配記憶體");
return 1;
}
// 設定整數的值
*ptr = 20;
// 列印整數值
printf("整數值: %d\n", *ptr);
// 釋放已分配的記憶體
free(ptr);
// 將指標設定為 NULL,以防止其被意外使用
ptr = NULL;
自己動手試一試 »
記憶體洩漏
記憶體洩漏發生在動態記憶體被分配但從未被釋放時。
如果在迴圈或頻繁呼叫的函式中發生記憶體洩漏,可能會佔用過多記憶體並導致計算機變慢。
在記憶體被釋放之前,指向動態記憶體的指標丟失,就有可能發生記憶體洩漏。這可能是意外發生的,因此要注意並跟蹤動態記憶體的指標非常重要。
以下是指向動態記憶體的指標可能丟失的一些示例。
示例 1
指標被覆蓋
int x = 5;
int *ptr;
ptr = calloc(2, sizeof(*ptr));
ptr = &x;
在此示例中,在指標更改為指向 x
之後,calloc()
分配的記憶體將無法再訪問。
示例 2
指標僅在函式內部存在
void myFunction() {
int *ptr;
ptr = malloc(sizeof(*ptr));
}
int main() {
myFunction();
printf("函式已結束");
return 0;
}
在此示例中,函式內部分配的記憶體會在函式結束後仍然分配,但無法再訪問。防止此問題的一種方法是在函式結束前釋放記憶體。
示例 3
由於重新分配失敗導致指標丟失
int* ptr;
ptr = malloc(sizeof(*ptr));
ptr = realloc(ptr, 2*sizeof(*ptr));
如果 realloc()
無法重新分配記憶體,它將返回一個指向 NULL
的指標,而原始記憶體將保持保留狀態。
在此示例中,如果 realloc()
失敗,則 NULL
指標被賦給 ptr
變數,覆蓋了原始記憶體地址,使其無法再訪問。
總結
總而言之,在 C 語言中管理記憶體時,請遵循最佳實踐
- 記住檢查錯誤(
NULL
返回值),以確定記憶體分配是否成功 - 防止記憶體洩漏 - 始終記住釋放不再使用的記憶體,否則程式可能會效能下降,甚至更糟的是,如果記憶體耗盡,程式可能會崩潰
- 將指標設定為
NULL
後再釋放記憶體,以防止您意外地繼續使用它