免费存储(堆动态分配...)

术语 是通用计算术语,表示存储器区域,可以独立于堆栈提供的存储器从中分配和解除分配部分。

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 而不是使用裸删除