免費儲存(堆動態分配...)
術語 堆 是通用計算術語,表示儲存器區域,可以獨立於堆疊提供的儲存器從中分配和解除分配部分。
在 C++
中,標準將該區域稱為自由商店,被認為是更準確的術語。
從 Free Store 分配的記憶體區域可能比分配它的原始範圍更長。也可以從 Free Store 分配太大而無法儲存在堆疊中的資料。
可以通過 new 和 delete 關鍵字分配和釋放原始記憶體。
float *foo = nullptr;
{
*foo = new float; // Allocates memory for a float
float bar; // Stack allocated
} // End lifetime of bar, while foo still alive
delete foo; // Deletes the memory for the float at pF, invalidating the pointer
foo = nullptr; // Setting the pointer to nullptr after delete is often considered good practice
也可以使用 new 和 delete 分配固定大小的陣列,語法略有不同。陣列分配與非陣列分配不相容,將兩者混合會導致堆損壞。分配陣列還會分配記憶體以跟蹤陣列的大小,以便以實現定義的方式稍後刪除。
// Allocates memory for an array of 256 ints
int *foo = new int[256];
// Deletes an array of 256 ints at foo
delete[] foo;
當使用 new 和 delete 而不是 malloc 和 free 時 ,建構函式和解構函式將被執行(類似於基於堆疊的物件)。這就是為什麼 new 和 delete 優先於 malloc 和 free 。
struct ComplexType {
int a = 0;
ComplexType() { std::cout << "Ctor" << std::endl; }
~ComplexType() { std::cout << "Dtor" << std::endl; }
};
// Allocates memory for a ComplexType, and calls its constructor
ComplexType *foo = new ComplexType();
//Calls the destructor for ComplexType() and deletes memory for a Complextype at pC
delete foo;
Version >= C++ 11
從 C++ 11 開始,建議使用智慧指標來指示所有權。
Version >= C++ 14
C++ 14 將 std::make_unique
新增到 STL,改變建議以支援 std::make_unique
或 std::make_shared
而不是使用裸新和刪除。