<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 new
nebo některým z calloc
malloc
tě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 new
nebo některým z calloc
malloc
tě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
neboexit
.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 new
volá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í new
naleznete 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í new
naleznete 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 ptr
v 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
}