Share via


<new> 運算子和列舉

enum align_val_t

enum class align_val_t : size_t {};

operator delete

運算式所 delete 呼叫的函式,用來解除配置個別物件的儲存空間。

void operator delete(void* ptr) noexcept;
void operator delete(void *, void*) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;

參數

ptr
要藉由刪除來讓值變成無效的指標。

備註

第一個 delete 函式是由運算式呼叫,以呈現不正確值 ptr 。 程式可以使用此函式簽章來定義函式,以取代「C++ 標準程式庫」所定義的預設版本。 必要的行為是接受 先前呼叫 所傳回的 或 值 ptrnullptroperator new

ptr 值的預設行為 nullptr 是不執行任何動作。 的任何其他值 ptr 都必須是稍早呼叫所 new 傳回的值,如先前所述。 非 Null 值 ptr 的預設行為是回收先前呼叫所配置的儲存體。 在後續呼叫 operator new 或 任何 、 callocmallocrealloc 函式時,未指定該部分或所有這類回收儲存體的情況。

第二個函式是由對應至 new 表單 new( std::size_t ) 運算式的放置 delete 運算式所呼叫。 它不會執行任何動作。

第三個函式是由對應至 new 表單 new( std::size_t, const std::nothrow_t& ) 運算式的放置 delete 運算式所呼叫。 程式可以使用此函式簽章來定義函式,以取代「C++ 標準程式庫」所定義的預設版本。 必要的行為是接受 的 nullptrptr ,或先前呼叫 所傳回的值 operator new 。 預設行為是評估 delete( ptr )

範例

如需使用 operator delete 的範例,請參閱 operator new

operator delete[]

運算式所 delete 呼叫的函式,用來解除配置物件陣列的儲存空間。

void operator delete[](void* ptr) noexcept;
void operator delete[](void *, void*) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;

參數

ptr
要藉由刪除來讓值變成無效的指標。

備註

呼叫第一個函式的是 delete[] 運算式,用來將 ptr 的值變成無效。 此函式可被取代,因為程式可以使用此函式簽章來定義函式,以取代「C++ 標準程式庫」所定義的預設版本。 必要的行為是接受 的 nullptrptr ,或先前呼叫 所傳回的值 operator new[]ptr 之 Null 值的預設行為是不執行任何動作。 ptr 的任何其他值必須是某個呼叫所傳回的值,如先前所述。 這類非 Null 值 ptr 的預設行為是回收先前呼叫所配置的儲存體。 在後續呼叫 operator new 或 任何 、 callocmallocrealloc 函式時,未指定該部分或所有這類回收儲存體的情況。

第二個函式是由對應至 new[] 表單 new[]( std::size_t ) 運算式的放置 delete[] 運算式所呼叫。 它不會執行任何動作。

第三個函式是由對應至 new[] 表單 new[]( std::size_t, const std::nothrow_t& ) 運算式的放置 delete[] 運算式所呼叫。 程式可以使用此函式簽章來定義函式,以取代「C++ 標準程式庫」所定義的預設版本。 必要的行為是接受 的 nullptrptr ,或先前呼叫運算子 new[] 所傳回的值。 預設行為是評估 delete[]( ptr )

範例

如需使用 operator delete[] 的範例,請參閱 operator new[]

operator new

new 運算式所呼叫來為個別物件配置儲存體的函式。

void* operator new(std::size_t count);
void* operator new(std::size_t count, const std::nothrow_t&) noexcept;
void* operator new(std::size_t count, void* ptr) noexcept;

參數

count
要配置的儲存體位元組數。

ptr
必須傳回指標。

傳回值

新配置儲存體之最低位元組位址的指標。 或者 ptr ,如果使用函式的第三種形式。

備註

第一個 new 函式是由運算式所呼叫,用來配置 count 適當對齊的儲存體位元組,以表示該大小的任何物件。 此函式可 取代。 這表示程式可以使用此函式簽章來定義替代函式,以取代 C++ 標準程式庫所定義的預設版本。

必要的行為是只有在儲存體可以如要求配置時,才傳回非 Null 指標。 每個這類配置都會為與任何其他已配置儲存體皆不相鄰的儲存體產生一個指標。 在由後續的呼叫所配置之儲存體的順序和相鄰性方面,並未指定。 也未指定初始預存值。 傳回的指標會指向所配置儲存體的開頭(最低位元組位址)。 如果 count 為零,則傳回的值不會與函式傳回的任何其他值相等。

預設行為是執行迴圈。 在該迴圈內,函式會先嘗試配置所要求的儲存體。 嘗試是否涉及對 的呼叫 malloc 未指定。 如果配置嘗試成功,函式會傳回所配置儲存體的指標。 否則,函式會呼叫 型 new_handler 別 的指定函式。 如果所呼叫的函式返回,迴圈就會重複執行。 當嘗試配置要求的儲存體成功或呼叫的函式未傳回時,迴圈就會終止。

new_handler 別函式的必要行為是執行下列其中一項作業:

  • 讓更多儲存體可供配置,然後返回。

  • abort呼叫 或 exit

  • 擲回 型別 bad_alloc 的物件。

函式的預設行為 new_handler 是擲回 型 bad_alloc 別 的物件。 值 nullptr 會指定預設 new_handler 函式。

後續呼叫 operator new 所配置的儲存體順序和連續性未指定,如同儲存在那裡的初始值一樣。

若要釋放由 的第一種形式 operator new 配置的儲存體,請呼叫 operator delete

第二個函式是由放置 new 運算式所呼叫,用來配置 count 適當對齊的儲存體位元組,以表示該大小的任何物件。 此函式可 取代。 這表示程式可以使用此函式簽章來定義替代函式,以取代 C++ 標準程式庫所定義的預設版本。

如果函式成功,預設行為會傳回 operator new( count ) 。 否則會傳回 nullptr

若要釋放由 第二種形式 operator new 配置的儲存體(也就是,如果未傳回 nullptr ),請呼叫 operator delete

第三個函式是由格式 new ( ptr ) T 的非配置放置 new 運算式所呼叫。 在這裡, ptr 由單一物件指標所組成。 在已知位址建構物件時,它很有用。 函式會傳回 ptr。 您必須在此物件上明確呼叫解構函式。

如果您呼叫非配置位置 new ,請勿呼叫 delete 。 相反地,請在呼叫 物件的解構函式之後,針對您提供的記憶體呼叫解除配置器。

如需 擲回或非擲回行為 new 的相關資訊,請參閱 newdelete 運算子

範例

// new_op_new.cpp
// compile with: /EHsc
#include<new>
#include<iostream>

using namespace std;

class MyClass {
    int member{ 0 };
public:
    MyClass() {
        cout << "MyClass at 0x" << this << " constructed.\n";
    };

    ~MyClass() {
        cout << "MyClass at 0x" << this << " destroyed.\n";
    };
};

int main( )
{
    // The first form of new / delete
    MyClass* fPtr1 = new MyClass;
    delete fPtr1;

    // The second form (fail returns nullptr) of new / delete
    MyClass* fPtr2 = new(nothrow) MyClass[2];
    if (fPtr2)
        delete fPtr2;

    // The third form (non-allocating placement) of new / delete
    char x[sizeof(MyClass)]; // x is automatic
    MyClass* fPtr3 = new(&x[0]) MyClass;
    fPtr3->~MyClass(); // Requires explicit destructor call
    // no delete because x is on the stack
}

operator new[]

new 運算式所呼叫來為物件陣列配置儲存體的配置函式。

void* operator new[](std::size_t count);
void* operator new[](std::size_t count, const std::nothrow_t&) noexcept;
void* operator new[](std::size_t count, void* ptr) noexcept;

參數

count
要為陣列物件配置的儲存體位元組數。

ptr
必須傳回指標。

傳回值

新配置儲存體之最低位元組位址的指標。 或者 ptr ,使用第三個表單時。

備註

呼叫第一個函式的是 new[] 運算式,用來配置已適當校準之 count 個位元組的儲存體,以代表等於或小於該大小的任何陣列物件。 程式可以使用此函式簽章來定義函式,以取代「C++ 標準程式庫」所定義的預設版本。 所需的行為與 operator new 相同。 如果預設行為成功,則會傳回 operator new( count ) 。 否則,它會擲 std::bad_alloc 回例外狀況(或衍生自 std::bad_alloc 的例外狀況)。 若要釋放這個形式的 operator new[] 配置儲存體,請呼叫 operator delete[]

呼叫第二個函式的是位置 new[] 運算式,用來配置已適當校準之 count 個位元組的儲存體,以代表該大小的任何陣列物件。 程式可以使用此函式簽章來定義函式,以取代「C++ 標準程式庫」所定義的預設版本。 如果函式成功,預設行為會傳回 operator new( count ) 。 否則會傳回 nullptr。 若要釋放這個形式的 operator new[] 配置儲存體,請呼叫 operator delete[] 。 如需 有關 擲回或非擲回行為 new 的詳細資訊,請參閱 newdelete 運算子

第三個函式是由格式 new( ptr ) T[ N ] 的非配置放置 new[] 運算式所呼叫。 此表單不會配置記憶體。 它會建構透過 參數傳入的記憶體中 ptr 物件。 函式會傳回 ptr。 您必須針對所建立的每個物件明確呼叫解構函式。 您必須負責為 提供足夠的記憶體 ptr 。 請勿在運算式所 new 傳回的值上叫 delete[] 用 。 相反地,如有必要,請在呼叫解構函式之後解除配置 ptr

範例

// new_op_array.cpp
// compile with: /EHsc
#include <new>
#include <iostream>

using namespace std;

class MyClass {
    int member{ 0 };
public:
    MyClass() {
        cout << "MyClass at 0x" << this << " constructed.\n";
    };

    ~MyClass() {
        cout << "MyClass at 0x" << this << " destroyed.\n";
    };
};

int main() {
    // The first form of array new / delete
    MyClass* fPtr1 = new MyClass[2];
    delete[] fPtr1;

    // The second form (fail returns nullptr) of array new / delete
    MyClass* fPtr2 = new(nothrow) MyClass[2];
    if (fPtr2)
        delete[] fPtr2;

    // The third form (non-allocating placement) of array new / delete
    char x[2 * sizeof(MyClass) + sizeof(int)]; // x is automatic

    MyClass* fPtr3 = new(&x[0]) MyClass[2];
    fPtr3[1].~MyClass(); // Requires explicit destructor calls
    fPtr3[0].~MyClass(); // Recommended in reverse construction order
    // Don't delete[] fPtr3 here.
    // delete[] &x[0] not required because x is on the stack
}