<new>
operatory i wyliczenia
enum align_val_t
enum class align_val_t : size_t {};
operator delete
Funkcja wywoływana delete
przez wyrażenie w celu cofnięcia przydziału magazynu dla poszczególnych obiektów.
void operator delete(void* ptr) noexcept;
void operator delete(void *, void*) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;
Parametry
ptr
Wskaźnik, którego wartość ma być renderowana jest nieprawidłowa przez usunięcie.
Uwagi
Pierwsza funkcja jest wywoływana delete
przez wyrażenie w celu renderowania wartości nieprawidłowej ptr
. Program może zdefiniować funkcję z tym podpisem funkcji, która zastępuje domyślną wersję zdefiniowaną przez bibliotekę standardową języka C++. Wymagane zachowanie polega na zaakceptowaniu ptr
wartości tej nullptr
wartości lub zwróconej przez wcześniejsze wywołanie metody .operator new
Domyślne zachowanie wartości w ptr
elemecie nullptr
to nic nie robić. Każda inna wartość musi być wartością ptr
zwracaną wcześniej przez wywołanie zgodnie z wcześniejszym opisem new
. Domyślnym zachowaniem wartości ptr
innej niż null jest odzyskanie magazynu przydzielonego przez wcześniejsze wywołanie. Nie określono, w jakich warunkach część lub wszystkie takie odzyskane magazyny są przydzielane przez kolejne wywołanie metody operator new
, lub do dowolnej z calloc
funkcji , malloc
lub realloc
.
Druga funkcja jest wywoływana przez wyrażenie umieszczania delete
odpowiadające new
wyrażeniu formularza new( std::size_t )
. To nic nie robi.
Trzecia funkcja jest wywoływana przez wyrażenie umieszczania delete
odpowiadające new
wyrażeniu formularza new( std::size_t, const std::nothrow_t& )
. Program może zdefiniować funkcję z tym podpisem funkcji, która zastępuje domyślną wersję zdefiniowaną przez bibliotekę standardową języka C++. Wymagane zachowanie polega na zaakceptowaniu wartości lub zwróconej ptr
przez wcześniejsze wywołanie metody operator new
.nullptr
Domyślne zachowanie polega na ocenie wartości delete( ptr )
.
Przykład
Zobacz operator new
przykład, który używa elementu operator delete
.
operator delete[]
Funkcja wywoływana przez delete
wyrażenie w celu cofnięcia przydziału magazynu dla tablicy obiektów.
void operator delete[](void* ptr) noexcept;
void operator delete[](void *, void*) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;
Parametry
ptr
Wskaźnik, którego wartość ma być renderowana jest nieprawidłowa przez usunięcie.
Uwagi
Pierwsza funkcja jest wywoływana przez delete[]
wyrażenie w celu renderowania wartości nieprawidłowej ptr
. Funkcja jest zamienialna, ponieważ program może zdefiniować funkcję z tym podpisem funkcji, który zastępuje domyślną wersję zdefiniowaną przez bibliotekę standardową języka C++. Wymagane zachowanie polega na zaakceptowaniu wartości lub zwróconej ptr
przez wcześniejsze wywołanie metody operator new[]
.nullptr
Domyślnym zachowaniem wartości null dla ptr
wartości null jest nic nie robić. Każda inna wartość musi być wartością ptr
zwracaną wcześniej przez wywołanie zgodnie z wcześniejszym opisem. Domyślnym zachowaniem takiej wartości ptr
innej niż null jest odzyskanie magazynu przydzielonego przez wcześniejsze wywołanie. Nie określono, w jakich warunkach część lub wszystkie takie odzyskane magazyny są przydzielane przez kolejne wywołanie metody operator new
, lub do dowolnej z calloc
funkcji , malloc
lub realloc
.
Druga funkcja jest wywoływana przez wyrażenie umieszczania delete[]
odpowiadające new[]
wyrażeniu formularza new[]( std::size_t )
. To nic nie robi.
Trzecia funkcja jest wywoływana przez wyrażenie umieszczania delete[]
odpowiadające new[]
wyrażeniu formularza new[]( std::size_t, const std::nothrow_t& )
. Program może zdefiniować funkcję z tym podpisem funkcji, która zastępuje domyślną wersję zdefiniowaną przez bibliotekę standardową języka C++. Wymagane zachowanie polega na zaakceptowaniu wartości lub zwróconej ptr
przez wcześniejsze wywołanie operatora new[]
.nullptr
Domyślne zachowanie polega na ocenie wartości delete[]( ptr )
.
Przykład
Zobacz operator new[]
przykłady użycia elementu operator delete[]
.
operator new
Funkcja wywoływana przez nowe wyrażenie w celu przydzielenia magazynu dla poszczególnych obiektów.
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;
Parametry
count
Liczba bajtów magazynu do przydzielenia.
ptr
Wskaźnik, który ma zostać zwrócony.
Wartość zwracana
Wskaźnik do najniższego adresu bajtu nowo przydzielonego magazynu. Lub ptr
, jeśli używasz trzeciej formy funkcji.
Uwagi
Pierwsza funkcja jest wywoływana przez new
wyrażenie, aby przydzielić count
bajty magazynu odpowiednio wyrównane do reprezentowania dowolnego obiektu tego rozmiaru. Ta funkcja jest zamienialna. Oznacza to, że program może zdefiniować funkcję alternatywną z tym podpisem funkcji, który zastępuje domyślną wersję zdefiniowaną przez bibliotekę standardową języka C++.
Wymagane zachowanie polega na zwracaniu wskaźnika innego niż null tylko wtedy, gdy magazyn można przydzielić zgodnie z żądaniem. Każda taka alokacja daje wskaźnik do rozłączenia magazynu z dowolnego innego przydzielonego magazynu. Kolejność i ciągłość magazynu przydzielonego przez kolejne wywołania są nieokreślone. Początkowa przechowywana wartość jest nieokreślona. Zwrócony wskaźnik wskazuje początek (najniższy adres bajtu) przydzielonego magazynu. Jeśli count
wartość jest równa zero, zwracana wartość nie jest porównywana z żadną inną wartością zwracaną przez funkcję.
Domyślne zachowanie polega na wykonaniu pętli. W pętli funkcja najpierw próbuje przydzielić żądany magazyn. Czy próba obejmuje wywołanie metody malloc
, jest nieokreślony. Jeśli próba alokacji zakończy się pomyślnie, funkcja zwróci wskaźnik do przydzielonego magazynu. W przeciwnym razie funkcja wywołuje wyznaczoną funkcję typu new_handler
. Jeśli wywołana funkcja zwraca, pętla powtarza się. Pętla kończy się, gdy próba przydzielenia żądanego magazynu zakończy się pomyślnie lub gdy wywołana funkcja nie zwróci.
Wymagane zachowanie funkcji typu new_handler
polega na wykonaniu jednej z następujących operacji:
Udostępnij więcej miejsca do alokacji, a następnie wróć.
Wywołaj metodę
abort
lubexit
.Wyrzuć obiekt typu
bad_alloc
.
Domyślne zachowanie new_handler
funkcji polega na wyrzuceniu obiektu typu bad_alloc
. Wartość nullptr
wyznacza funkcję domyślną new_handler
.
Kolejność i ciągłość magazynu przydzielonego przez kolejne wywołania są operator new
nieokreślone, podobnie jak wartości początkowe, które są tam przechowywane.
Aby zwolnić magazyn przydzielony przez pierwszą formę operator new
, wywołaj metodę operator delete
.
Druga funkcja jest wywoływana przez wyrażenie umieszczania new
w celu przydzielenia count
bajtów magazynu odpowiednio wyrównanego do dowolnego obiektu tego rozmiaru. Ta funkcja jest zamienialna. Oznacza to, że program może zdefiniować funkcję alternatywną z tym podpisem funkcji, który zastępuje domyślną wersję zdefiniowaną przez bibliotekę standardową języka C++.
Zachowaniem domyślnym jest zwrócenie operator new( count )
, jeśli ta funkcja powiedzie się. W przeciwnym razie zwraca wartość nullptr
.
Aby zwolnić magazyn przydzielony przez drugą formę operator new
(czyli jeśli nie zwróciła nullptr
), wywołaj metodę operator delete
.
Trzecia funkcja jest wywoływana przez nieprzydzielające wyrażenie umieszczania new
formularza new ( ptr ) T
. ptr
W tym miejscu składa się z pojedynczego wskaźnika obiektu. Może to być przydatne do konstruowania obiektu pod znanym adresem. Funkcja zwraca ptr
wartość . Należy jawnie wywołać destruktor dla tego obiektu.
Jeśli wywołasz nieprzydzielenie umieszczania new
, nie wywołaj metody delete
. Zamiast tego wywołaj przydział dla podanej pamięci, jeśli jest to konieczne, po wywołaniu destruktora dla obiektu.
Aby uzyskać informacje na temat zgłaszania lub nierzucania zachowania new
, zobacz Operatorynew
idelete
.
Przykład
// 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[]
Funkcja alokacji wywoływana przez nowe wyrażenie w celu przydzielenia magazynu dla tablicy obiektów.
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;
Parametry
count
Liczba bajtów magazynu do przydzielenia dla obiektu tablicy.
ptr
Wskaźnik, który ma zostać zwrócony.
Wartość zwracana
Wskaźnik do najniższego adresu bajtu nowo przydzielonego magazynu. Lub ptr
, gdy jest używany trzeci formularz.
Uwagi
Pierwsza funkcja jest wywoływana przez new[]
wyrażenie w celu przydzielenia count
bajtów magazynu odpowiednio dopasowanego do dowolnego obiektu tablicy tego rozmiaru lub mniejszego. Program może zdefiniować funkcję z tym podpisem funkcji, która zastępuje domyślną wersję zdefiniowaną przez bibliotekę standardową języka C++. Wymagane zachowanie jest takie samo jak w przypadku operator new
elementu . Zachowaniem domyślnym jest zwrócenie operator new( count )
, jeśli zakończy się powodzeniem. W przeciwnym razie zgłasza wyjątek std::bad_alloc
(lub wyjątek pochodzący z std::bad_alloc
metody ). Aby zwolnić magazyn przydzielony przez tę formę operator new[]
, wywołaj metodę operator delete[]
.
Druga funkcja jest wywoływana przez wyrażenie umieszczania new[]
, aby przydzielić count
bajty magazynu odpowiednio wyrównane do reprezentowania dowolnego obiektu tablicy tego rozmiaru. Program może zdefiniować funkcję z tym podpisem funkcji, która zastępuje domyślną wersję zdefiniowaną przez bibliotekę standardową języka C++. Zachowaniem domyślnym jest zwrócenie operator new( count )
, jeśli ta funkcja powiedzie się. W przeciwnym razie zwraca wartość nullptr
. Aby zwolnić magazyn przydzielony przez tę formę operator new[]
, wywołaj metodę operator delete[]
. Aby uzyskać więcej informacji na temat zgłaszania lub nierzucania zachowania new
, zobacz Operatory new
idelete
.
Trzecia funkcja jest wywoływana przez nieprzydzielające wyrażenie umieszczania new[]
formularza new( ptr ) T[ N ]
. Ten formularz nie przydziela pamięci. Konstruuje obiekty w pamięci przekazywanej za pośrednictwem parametru ptr
. Funkcja zwraca ptr
wartość . Należy jawnie wywołać destruktor dla każdego utworzonego obiektu. Odpowiadasz za zapewnienie wystarczającej ilości pamięci dla programu ptr
. Nie należy wywoływać delete[]
wartości zwracanej przez new
wyrażenie. Zamiast tego cofnij ptr
przydział , jeśli to konieczne, po wywołaniu destruktorów.
Przykład
// 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
}