C語言記憶體管理,分配、使用、釋放以及安全性

Augustone發表於2024-08-15

在C++中,記憶體分配是透過幾種不同的方式來管理的。這包括自動儲存、靜態儲存和動態儲存。下面分別解釋這些儲存類別以及如何使用它們進行記憶體分配。

#1,自動儲存(Automatic Storage)

這是最常用的儲存型別,當一個變數在函式內被宣告時,它會自動獲得儲存空間,並且在函式結束時自動釋放。例如:

void example() {
int x = 5; // x 是自動儲存
}


#2,靜態儲存(Static Storage)


靜態儲存的變數在整個程式執行期間都存在,即使在函式呼叫之間也保留其值。可以在全域性作用域或函式內部宣告靜態變數。

void example() {
static int x = 5; // x 在整個程式執行期間存在
}


#3,動態儲存(Dynamic Storage)

動態儲存用於在程式執行時按需分配和釋放記憶體。這通常透過`new`和`delete`運算子完成。

##31,使用 `new` 分配記憶體
`new`運算子用於在堆上分配記憶體。它返回一個指向所分配記憶體的指標。

int* ptr = new int(5); // 分配一個int大小的記憶體,並初始化為5


如果需要分配陣列,可以使用:

int* arr = new int[10]; // 分配10個int大小的記憶體


##32使用 `delete` 釋放記憶體
`delete`運算子用於釋放透過`new`分配的記憶體。對於單個物件和陣列,語法不同。

delete ptr; // 釋放單個物件

delete[] arr; // 釋放陣列


#33,C 風格動態記憶體管理
雖然不推薦,但C++也支援C風格的記憶體管理,使用`malloc`和`free`函式,不過它們不是型別安全的。

#include <cstdlib>

int* ptr = (int*)malloc(sizeof(int)); // 分配記憶體
*ptr = 5; // 使用記憶體
free(ptr); // 釋放記憶體


#記憶體管理注意事項
- 必須確保每個`new`都有對應的`delete`。
- 如果忘記釋放記憶體,會導致記憶體洩漏。
- 過度釋放或未初始化的指標可能導致程式崩潰或未定義行為。

相關文章