安置新的

有些情况下我们不想依赖 Free Store 来分配内存,我们希望使用 new 来使用自定义内存分配。

对于这些情况,我们可以使用 Placement New,我们可以告诉`new’运算符从预先分配的内存位置分配内存

例如

int a4byteInteger;

char *a4byteChar = new (&a4byteInteger) char[4];

在这个例子中,a4byteChar 指向的内存是通过整数变量 a4byteInteger 分配给’stack’的 4 字节。

这种内存分配的好处是程序员控制分配的事实。在上面的例子中,由于 a4byteInteger 是在堆栈上分配的,我们不需要显式调用’delete a4byteChar`。

对于动态分配的存储器也可以实现相同的行为。例如

int *a8byteDynamicInteger = new int[2];

char *a8byteChar = new (a8byteDynamicInteger) char[8];

在这种情况下,a8byteChar 的内存指针将指的是 a8byteDynamicInteger 分配的动态内存。但是,在这种情况下,我们需要显式 calldelete a8byteDynamicInteger 来释放内存

C++类的另一个例子

struct ComplexType {
    int a;

    ComplexType() : a(0) {}
    ~ComplexType() {}
};

int main() {
    char* dynArray = new char[256];

    //Calls ComplexType's constructor to initialize memory as a ComplexType
    new((void*)dynArray) ComplexType();

    //Clean up memory once we're done
    reinterpret_cast<ComplexType*>(dynArray)->~ComplexType();
    delete[] dynArray;

    //Stack memory can also be used with placement new
    alignas(ComplexType) char localArray[256]; //alignas() available since C++11

    new((void*)localArray) ComplexType();

    //Only need to call the destructor for stack memory
    reinterpret_cast<ComplexType*>(localArray)->~ComplexType();

    return 0;
}