<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++ 標準程式庫」所定義的預設版本。 必要的行為是接受 先前呼叫 所傳回的 或 值ptr
nullptr
。operator new
中ptr
值的預設行為nullptr
是不執行任何動作。 的任何其他值 ptr
都必須是稍早呼叫所 new
傳回的值,如先前所述。 非 Null 值 ptr
的預設行為是回收先前呼叫所配置的記憶體。 在後續呼叫 operator new
或 任何、 calloc
malloc
或 realloc
函式時,未指定該部分或所有這類回收記憶體的情況。
第二個函式是由對應至new
窗體 new( std::size_t )
表達式的放置delete
表達式所呼叫。 它不會執行任何動作。
第三個函式是由對應至new
窗體 new( std::size_t, const std::nothrow_t& )
表達式的放置delete
表達式所呼叫。 程式可以使用此函式簽章來定義函式,以取代「C++ 標準程式庫」所定義的預設版本。 必要的行為是接受的 nullptr
值ptr
,或先前呼叫 所傳回的值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++ 標準程式庫」所定義的預設版本。 必要的行為是接受的 nullptr
值ptr
,或先前呼叫 所傳回的值operator new[]
。 ptr
之 Null 值的預設行為是不執行任何動作。 ptr
的任何其他值必須是某個呼叫所傳回的值,如先前所述。 這類非 Null 值 ptr
的預設行為是回收先前呼叫所配置的記憶體。 在後續呼叫 operator new
或 任何、 calloc
malloc
或 realloc
函式時,未指定該部分或所有這類回收記憶體的情況。
第二個函式是由對應至new[]
窗體 new[]( std::size_t )
表達式的放置delete[]
表達式所呼叫。 它不會執行任何動作。
第三個函式是由對應至new[]
窗體 new[]( std::size_t, const std::nothrow_t& )
表達式的放置delete[]
表達式所呼叫。 程式可以使用此函式簽章來定義函式,以取代「C++ 標準程式庫」所定義的預設版本。 必要的行為是接受的 nullptr
值ptr
,或先前呼叫運算子 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
的相關信息,請參閱 new
和 delete
運算符。
範例
// 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
的詳細資訊,請參閱 new
和 delete
運算符。
第三個函式是由格式 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
}