Udostępnij za pośrednictwem


<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 callocfunkcji , malloclub 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 callocfunkcji , malloclub 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 lub exit.

  • 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 ptrwartość . 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 newelementu . 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_allocmetody ). 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 newidelete.

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 ptrwartość . 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 ptrprzydział , 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
}