Sdílet prostřednictvím


<new> operátory a výčty

enum align_val_t

enum class align_val_t : size_t {};

operator delete

Funkce volaná výrazem delete pro uvolnění úložiště pro jednotlivé objekty.

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

Parametry

ptr
Ukazatel, jehož hodnota se má vykreslit odstraněním jako neplatná.

Poznámky

První funkce je volána výrazem delete pro vykreslení hodnoty ptr neplatné. Program může definovat funkci s tímto podpisem funkce, která nahrazuje výchozí verzi definovanou standardní knihovnou C++. Požadované chování spočívá v přijetí hodnoty ptr , která byla nullptr vrácena dřívějším voláním operator new.

Výchozí chování hodnoty nullptr v ptr této hodnotě není nic dělat. Jakákoli jiná hodnota ptr musí být hodnotou vrácenou new dříve voláním, jak bylo popsáno výše. Výchozím chováním hodnoty, která není null, ptr je uvolnění úložiště přiděleného předchozím voláním. Není specifikováno za jakých podmínek je část nebo všechna taková uvolněná úložiště přidělena následným voláním operator newnebo některým z callocmalloctěchto funkcí nebo realloc funkcí.

Druhá funkce je volána výrazem umístění delete , který odpovídá new výrazu formuláře new( std::size_t ). Nedělá nic.

Třetí funkce je volána výrazem umístění delete , který odpovídá new výrazu formuláře new( std::size_t, const std::nothrow_t& ). Program může definovat funkci s tímto podpisem funkce, která nahrazuje výchozí verzi definovanou standardní knihovnou C++. Požadované chování je přijmout hodnotu ptr , která je nullptr nebo byla vrácena dřívějším voláním operator new. Výchozí chování je vyhodnotit delete( ptr ).

Příklad

Podívejte operator new se na příklad, který používá operator delete.

operator delete[]

Funkce volaná výrazem delete pro uvolnění úložiště pro pole objektů.

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

Parametry

ptr
Ukazatel, jehož hodnota se má vykreslit odstraněním jako neplatná.

Poznámky

První funkce je volána výrazem delete[] k vykreslení hodnoty ptr neplatné. Funkce je nahraditelná, protože program může definovat funkci s tímto podpisem funkce, která nahrazuje výchozí verzi definovanou standardní knihovnou jazyka C++. Požadované chování je přijmout hodnotu ptr , která je nullptr nebo byla vrácena dřívějším voláním operator new[]. Výchozí chování hodnoty null ptr je nedělejte nic. Jakákoli jiná hodnota ptr musí být hodnotou vrácenou dříve voláním, jak bylo popsáno výše. Výchozím chováním takové hodnoty ptr , která není null, je uvolnění úložiště přiděleného předchozím voláním. Není specifikováno za jakých podmínek je část nebo všechna taková uvolněná úložiště přidělena následným voláním operator newnebo některým z callocmalloctěchto funkcí nebo realloc funkcí.

Druhá funkce je volána výrazem umístění delete[] , který odpovídá new[] výrazu formuláře new[]( std::size_t ). Nedělá nic.

Třetí funkce je volána výrazem umístění delete[] , který odpovídá new[] výrazu formuláře new[]( std::size_t, const std::nothrow_t& ). Program může definovat funkci s tímto podpisem funkce, která nahrazuje výchozí verzi definovanou standardní knihovnou C++. Požadované chování je přijmout hodnotu ptr , která je nullptr nebo která byla vrácena dřívějším voláním operátoru new[]. Výchozí chování je vyhodnotit delete[]( ptr ).

Příklad

Příklady operator new[] použití operator delete[].

operator new

Funkce volaná novým výrazem pro přidělení úložiště pro jednotlivé objekty.

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
Počet bajtů úložiště, které se mají přidělit.

ptr
Ukazatel, který se má vrátit.

Vrácená hodnota

Ukazatel na nejnižší adresu bajtu nově přiděleného úložiště. Nebo ptr, pokud používá třetí formu funkce.

Poznámky

První funkce je volána výrazem new , který přidělí count bajty úložiště, které jsou vhodně zarovnané tak, aby představovaly libovolný objekt této velikosti. Tato funkce je nahraditelná. Znamená to, že program může definovat alternativní funkci s tímto podpisem funkce, která nahradí výchozí verzi definovanou standardní knihovnou C++.

Požadované chování je vrátit nenulový ukazatel pouze v případě, že úložiště může být přiděleno podle požadavku. Každé takové přidělení poskytuje ukazatel na oddělené úložiště od jakéhokoli jiného přiděleného úložiště. Pořadí a souvislost úložiště přiděleného následnými voláními není zadána. Počáteční uložená hodnota není zadána. Vrácený ukazatel odkazuje na začátek (nejnižší bajtová adresa) přiděleného úložiště. Pokud count je nula, vrácená hodnota se nerovná žádné jiné hodnotě vrácené funkcí.

Výchozím chováním je spuštění smyčky. Ve smyčce se funkce nejprve pokusí přidělit požadované úložiště. Jestli se pokus týká volání malloc , není zadané. Pokud je pokus o přidělení úspěšný, vrátí funkce ukazatel na přidělené úložiště. V opačném případě funkce volá určenou funkci typu new_handler. Pokud se volá funkce, smyčka se opakuje. Smyčka se ukončí, když dojde k úspěšnému přidělení požadovaného úložiště nebo když se zavoláná funkce nevrátí.

Požadované chování funkce typu new_handler je provedení jedné z následujících operací:

  • Zpřístupnit více úložiště pro přidělení a pak vrátit.

  • Zavolejte buď abort nebo exit.

  • Vyvolá objekt typu bad_alloc.

Výchozí chování new_handler funkce je vyvolání objektu typu bad_alloc. Hodnota nullptr určuje výchozí new_handler funkci.

Pořadí a souvislost úložiště přiděleného následnými voláními operator new není zadána, protože jsou tam uloženy počáteční hodnoty.

K uvolnění úložiště přiděleného první formou operator newvolání operator delete.

Druhá funkce je volána výrazem umístění new , který přidělí count bajty úložiště, které jsou vhodně zarovnané tak, aby představovaly libovolný objekt této velikosti. Tato funkce je nahraditelná. Znamená to, že program může definovat alternativní funkci s tímto podpisem funkce, která nahradí výchozí verzi definovanou standardní knihovnou C++.

Výchozí chování je vrátit operator new( count ) , pokud je tato funkce úspěšná. V opačném případě se vrátí nullptr.

Pokud chcete uvolnit úložiště přidělené druhou formou operator new (to znamená, že pokud se nevrátila nullptr), zavolejte operator delete.

Třetí funkce je volána nelokačním výrazem umístění new formuláře new ( ptr ) T. ptr Tady se skládá z jednoho ukazatele objektu. Může být užitečné při vytváření objektu na známé adrese. Funkce vrátí ptr. Destruktor musíte explicitně volat u tohoto objektu.

Pokud voláte nelokaci umístění new, nezavolejte delete. Místo toho volejte uvolnění paměti, kterou jste zadali, v případě potřeby po volání destruktoru objektu.

Informace o vyvolání nebo vyvolání chování newnaleznete v tématu Operátory new a delete operátory.

Příklad

// 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[]

Funkce přidělení volaná novým výrazem pro přidělení úložiště pro pole objektů.

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
Početch

ptr
Ukazatel, který se má vrátit.

Vrácená hodnota

Ukazatel na nejnižší adresu bajtu nově přiděleného úložiště. Nebo ptr, při použití třetího formuláře.

Poznámky

První funkce je volána výrazem new[] , který přiděluje count bajty úložiště, které jsou vhodně zarovnané tak, aby představovaly jakýkoli maticový objekt této velikosti nebo menší. Program může definovat funkci s tímto podpisem funkce, která nahrazuje výchozí verzi definovanou standardní knihovnou C++. Požadované chování je stejné jako u operator new. Výchozí chování je vrátit operator new( count ) , pokud bude úspěšné. V opačném případě vyvolá std::bad_alloc výjimku (nebo výjimku odvozenou od std::bad_alloc). K uvolnění úložiště přiděleného touto formou operator new[]volání operator delete[].

Druhá funkce se volá výrazem umístění new[] , který přidělí count bajty úložiště, které jsou vhodně zarovnané tak, aby představovaly libovolný objekt pole dané velikosti. Program může definovat funkci s tímto podpisem funkce, která nahrazuje výchozí verzi definovanou standardní knihovnou C++. Výchozí chování je vrátit operator new( count ) , pokud je tato funkce úspěšná. V opačném případě se vrátí nullptr. K uvolnění úložiště přiděleného touto formou operator new[]volání operator delete[]. Další informace o vyvolání nebo nehození chování newnaleznete v tématu a new delete operátory.

Třetí funkce je volána nelokačním výrazem umístění new[] formuláře new( ptr ) T[ N ]. Tento formulář nepřiděluje paměť. Vytvoří objekty v paměti předané prostřednictvím parametru ptr . Funkce vrátí ptr. Destruktor je nutné volat explicitně pro každý vytvořený objekt. Zodpovídáte za poskytování dostatečné paměti pro ptr. Nevyvolávejte delete[] hodnotu vrácenou výrazem new . Místo toho uvolněte ptrv případě potřeby destruktory.

Příklad

// 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
}