選單
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

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 語言中管理記憶體時,請遵循最佳實踐

  1. 記住檢查錯誤(NULL 返回值),以確定記憶體分配是否成功
  2. 防止記憶體洩漏 - 始終記住釋放不再使用的記憶體,否則程式可能會效能下降,甚至更糟的是,如果記憶體耗盡,程式可能會崩潰
  3. 將指標設定為 NULL 後再釋放記憶體,以防止您意外地繼續使用它



×

聯絡銷售

如果您想將 W3Schools 服務用於教育機構、團隊或企業,請傳送電子郵件給我們
sales@w3schools.com

報告錯誤

如果您想報告錯誤,或想提出建議,請傳送電子郵件給我們
help@w3schools.com

W3Schools 經過最佳化,旨在方便學習和培訓。示例可能經過簡化,以提高閱讀和學習體驗。教程、參考資料和示例會不斷審查,以避免錯誤,但我們無法保證所有內容的完全正確性。使用 W3Schools 即表示您已閱讀並接受我們的使用條款Cookie 和隱私政策

版權所有 1999-2024 Refsnes Data。保留所有權利。W3Schools 由 W3.CSS 提供支援