免費儲存(堆動態分配...)

術語 是通用計算術語,表示儲存器區域,可以獨立於堆疊提供的儲存器從中分配和解除分配部分。

C++中,標準將該區域稱為自由商店,被認為是更準確的術語。

Free Store 分配的記憶體區域可能比分配它的原始範圍更長。也可以從 Free Store 分配太大而無法儲存在堆疊中的資料。

可以通過 newdelete 關鍵字分配和釋放原始記憶體。

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

也可以使用 newdelete 分配固定大小的陣列,語法略有不同。陣列分配與非陣列分配不相容,將兩者混合會導致堆損壞。分配陣列還會分配記憶體以跟蹤陣列的大小,以便以實現定義的方式稍後刪除。

// Allocates memory for an array of 256 ints
int *foo = new int[256];
// Deletes an array of 256 ints at foo
delete[] foo;

當使用 newdelete 而不是 mallocfree 時 ,建構函式和解構函式將被執行(類似於基於堆疊的物件)。這就是為什麼 newdelete 優先於 mallocfree

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_uniquestd::make_shared 而不是使用裸刪除