<new>
Operadores e enumerações de
enum align_val_t
enum class align_val_t : size_t {};
operator delete
A função que é chamada por uma expressão delete
para alocar o armazenamento de objetos individuais.
void operator delete(void* ptr) noexcept;
void operator delete(void *, void*) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;
Parâmetros
ptr
O ponteiro cujo valor será renderizado como inválido pela exclusão.
Comentários
A primeira função é chamada por uma expressão delete
para renderizar o valor de ptr
inválido. O programa pode definir uma função com essa assinatura de função que substitui a versão padrão definida pela biblioteca padrão C++. O comportamento necessário é aceitar um valor de ptr
que é nullptr
ou que foi retornado por uma chamada anterior para operator new
.
O comportamento padrão para um valor nullptr
em ptr
é não fazer nada. Qualquer outro valor de ptr
deve ser um valor retornado anteriormente por uma chamada new
descrita anteriormente. O comportamento padrão para um valor não nulo de ptr
é recuperar o armazenamento alocado pela chamada anterior. Não é especificado em quais condições parte ou todo esse armazenamento recuperado será alocado por uma chamada subsequente para operator new
, ou para qualquer uma das funções calloc
, malloc
ou realloc
.
A segunda função será chamada por uma expressão delete
de posicionamento correspondente a uma expressão new
da forma new( std::size_t )
. Ela não faz nada.
A terceira função será chamada por uma expressão delete
de posicionamento correspondente a uma expressão new
da forma new( std::size_t, const std::nothrow_t& )
. O programa pode definir uma função com essa assinatura de função que substitui a versão padrão definida pela biblioteca padrão C++. O comportamento necessário é aceitar um valor de ptr
que é nullptr
ou que foi retornado por uma chamada anterior para operator new
. O comportamento padrão é avaliar delete( ptr )
.
Exemplo
Confira operator new
para ver um exemplo que usa operator delete
.
operator delete[]
A função que é chamada por uma expressão delete
para desalocar o armazenamento para uma matriz de objetos.
void operator delete[](void* ptr) noexcept;
void operator delete[](void *, void*) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;
Parâmetros
ptr
O ponteiro cujo valor será renderizado como inválido pela exclusão.
Comentários
A primeira função é chamada por uma expressão delete[]
para renderizar o valor de ptr
inválido. O programa pode ser substituído porque pode definir uma função com essa assinatura de função que substitui a versão padrão definida pela biblioteca padrão C++. O comportamento necessário é aceitar um valor de ptr
que é nullptr
ou que foi retornado por uma chamada anterior para operator new[]
. O comportamento padrão para um valor nulo de ptr
é fazer nada. Qualquer outro valor de ptr
deve ser um valor retornado anteriormente por uma chamada descrita anteriormente. O comportamento padrão para um valor não nulo de ptr
é recuperar o armazenamento alocado pela chamada anterior. Não é especificado em quais condições parte ou todo esse armazenamento recuperado será alocado por uma chamada subsequente para operator new
, ou para qualquer uma das funções calloc
, malloc
ou realloc
.
A segunda função será chamada por uma expressão delete[]
de posicionamento correspondente a uma expressão new[]
da forma new[]( std::size_t )
. Ela não faz nada.
A terceira função será chamada por uma expressão delete[]
de posicionamento correspondente a uma expressão new[]
da forma new[]( std::size_t, const std::nothrow_t& )
. O programa pode definir uma função com essa assinatura de função que substitui a versão padrão definida pela biblioteca padrão C++. O comportamento necessário é aceitar um valor de ptr
que é nullptr
ou que foi retornado por uma chamada anterior para o operador new[]
. O comportamento padrão é avaliar delete[]( ptr )
.
Exemplo
Confira operator new[]
para ver exemplos do uso de operator delete[]
.
operator new
A função que é chamada por uma expressão new para alocar o armazenamento de objetos individuais.
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;
Parâmetros
count
O número de bytes de armazenamento a ser alocado.
ptr
O ponteiro a ser retornado.
Valor retornado
Um ponteiro para o endereço de byte mais baixo do armazenamento alocado recentemente. Ou ptr
, se estiver usando a terceira forma da função.
Comentários
A primeira função é chamada por uma expressão new
para alocar count
bytes de armazenamento adequadamente alinhados para representar qualquer objeto desse tamanho. Essa função é substituível. Significa que o programa pode definir uma função alternativa com essa assinatura de função que substitui a versão padrão definida pela biblioteca padrão C++.
É o comportamento necessário para retornar um ponteiro não nulo apenas se o armazenamento puder ser alocado conforme solicitado. Cada alocação produz um ponteiro para o armazenamento separado de qualquer outro armazenamento alocado. A ordem e a proximidade de armazenamento alocado por chamadas sucessivas não estão especificadas. O valor armazenado inicial não é especificado. O ponteiro retornado aponta para o início (o endereço mais baixo de byte) do armazenamento alocado. Se count
for zero, o valor retornado não será comparado de modo igual a qualquer outro valor retornado pela função.
O comportamento padrão é executar um loop. Dentro do loop, a função primeiro tenta alocar o armazenamento solicitado. Não é especificado se a tentativa envolve uma chamada para malloc
. Se a tentativa de alocação for bem-sucedida, a função retornará um ponteiro para o armazenamento alocado. Caso contrário, a função chama a função designada do tipo new_handler
. Se a função chamada retornar, o loop se repete. O loop é encerrado quando uma tentativa de alocar o armazenamento solicitado é bem-sucedida ou quando uma função chamada não retorna.
O comportamento necessário de uma função do tipo new_handler
é realizar uma das seguintes operações:
Disponibilizar mais armazenamento para alocação e retornar.
Chame
abort
ouexit
.Lança um objeto do tipo
bad_alloc
.
O comportamento padrão de uma função new_handler
é lançar um objeto do tipo bad_alloc
. Um valor nullptr
designa a função padrão new_handler
.
A ordem e a proximidade de armazenamento alocadas por chamadas sucessivas para operator new
não são especificadas, assim como os valores iniciais armazenados lá.
Para liberar o armazenamento alocado pela primeira forma de operator new
, chame operator delete
.
A segunda função é chamada por uma expressão de substituição new
para alocar count
bytes de armazenamento adequadamente alinhados para representar qualquer objeto desse tamanho. Essa função é substituível. Significa que o programa pode definir uma função alternativa com essa assinatura de função que substitui a versão padrão definida pela biblioteca padrão C++.
O comportamento padrão será retornar operator new( count )
se a função for bem-sucedida. Caso contrário, ele retornará nullptr
.
Para liberar o armazenamento alocado pela segunda forma de operator new
(ou seja, se não retornou nullptr
), chame operator delete
.
A terceira função é chamada por uma expressão new
de posicionamento não alocadora da forma new ( ptr ) T
. Aqui, ptr
consiste em um ponteiro de objeto único. Ele pode ser útil para criar um objeto em um endereço conhecido. A função retorna ptr
. Você deve chamar o destruidor explicitamente nesse objeto.
Se você chamar o posicionamento não alocador new
, não chame delete
. Em vez disso, chame o desalocador para a memória que você forneceu, se necessário, depois de chamar o destruidor para o objeto.
Para obter informações sobre o comportamento de lançamento ou não lançamento de new
, confira Os operadores new
e delete
.
Exemplo
// 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[]
A função de alocação que é chamada por uma expressão new para alocar o armazenamento para uma matriz de objetos.
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;
Parâmetros
count
O número de bytes de armazenamento a ser alocado para o objeto de matriz.
ptr
O ponteiro a ser retornado.
Valor retornado
Um ponteiro para o endereço de byte mais baixo do armazenamento alocado recentemente. Ou ptr
, quando a terceira forma for usada.
Comentários
A primeira função é chamada por uma expressão new[]
para alocar count
bytes de armazenamento adequadamente alinhados para representar qualquer objeto de matriz desse tamanho ou menor. O programa pode definir uma função com essa assinatura de função que substitui a versão padrão definida pela biblioteca padrão C++. O comportamento necessário é o mesmo usado para operator new
. O comportamento padrão é retornar operator new( count )
se houver êxito. Caso contrário, ele gera uma exceção std::bad_alloc
(ou uma exceção derivada de std::bad_alloc
). Para liberar o armazenamento alocado por essa forma de operator new[]
, chame operator delete[]
.
A segunda função é chamada por uma expressão new[]
de substituição para alocar count
bytes de armazenamento adequadamente alinhados para representar qualquer objeto de matriz desse tamanho. O programa pode definir uma função com essa assinatura de função que substitui a versão padrão definida pela biblioteca padrão C++. O comportamento padrão será retornar operator new( count )
se a função for bem-sucedida. Caso contrário, ele retornará nullptr
. Para liberar o armazenamento alocado por essa forma de operator new[]
, chame operator delete[]
. Para obter mais informações sobre o comportamento de lançamento ou não lançamento de new
, confira Os operadores new
e delete
.
A terceira função é chamada por uma expressão new[]
de posicionamento não alocadora da forma new( ptr ) T[ N ]
. Essa forma não aloca memória. Ele constrói os objetos na memória passada por meio do parâmetro ptr
. A função retorna ptr
. Você deve chamar o destruidor explicitamente para cada objeto criado. Você é responsável por fornecer memória suficiente para ptr
. Não invoque delete[]
no valor retornado pela expressão new
. Em vez disso, desaloque ptr
, se necessário, depois de chamar os destruidores.
Exemplo
// 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
}