安置新的

有些情況下我們不想依賴 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;
}