Operador new (C++)
Aloca memória para um objeto ou uma matriz de objetos de type-name do repositório livre e retorna um ponteiro diferente de zero e adequadamente tipado para o objeto.
Dica
As Extensões de Componentes do Microsoft C++ fornecem suporte para a palavra-chave new a fim de adicionar entradas de slot a vtable.Para obter mais informações, consulte novo (novo slot em vtable).
[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]
Comentários
Caso não seja bem-sucedido, new retorna zero ou lança uma exceção; consulte Os operadores new e delete para obter mais informações. Você pode alterar esse comportamento padrão escrevendo uma rotina de manipulação de exceção personalizada e chamando a função _set_new_handler da biblioteca em tempo de execução com o nome da sua função como argumento.
Para obter informações sobre como criar um objeto no heap gerenciado, consulte gcnew.
Quando new é usado para alocar memória para um objeto de classe do C++, o construtor do objeto é chamado após a memória ser alocada.
Use o operador delete para desalocar a memória alocada com o operador new.
O exemplo a seguir aloca e depois libera uma matriz bidimensional de caracteres de tamanho dim por 10. Ao alocar uma matriz multidimensional, todas as dimensões, exceto a primeira, devem ser expressões de constantes que são avaliadas como valores positivos; a dimensão mais à esquerda da matriz pode ser qualquer expressão que seja avaliada como um valor positivo. Ao alocar uma matriz usando o operador new, a primeira dimensão pode ser zero: o operador new retorna um ponteiro exclusivo.
char (*pchar)[10] = new char[dim][10];
delete [] pchar;
type-name não pode conter const, volatile, declarações de classe nem declarações de enumeração. Dessa forma, a expressão a seguir é inválida:
volatile char *vch = new volatile char[20];
O operador new não aloca tipos de referência porque eles não são objetos.
O operador new não pode ser usado para alocar uma função, mas pode ser usado para alocar ponteiros para funções. O exemplo a seguir aloca e depois libera uma matriz de sete ponteiros para funções que retornam inteiros.
int (**p) () = new (int (*[7]) ());
delete *p;
Se você usar o operador new sem nenhum argumento extra e o compilar com a opção /GX, /EHa ou /EHs, o compilador irá gerar um código para chamar o operador delete caso o construtor lance uma exceção.
A lista a seguir descreve os elementos de gramática de new:
placement
Fornece uma maneira de passar argumentos adicionais se você sobrecarregar new.type-name
Especifica o tipo a ser alocado; pode ser um tipo definido pelo usuário ou interno. Se a especificação de tipo for complicada, poderá ficar entre parênteses para forçar a ordem de associação.initializer
Fornece um valor para o objeto inicializado. Não é possível especificar inicializadores para matrizes. O operador new só criará matrizes de objetos se a classe tiver um construtor padrão.
Exemplo
O exemplo de código a seguir aloca uma matriz de caracteres e um objeto da classe CName e depois os libera.
// expre_new_Operator.cpp
// compile with: /EHsc
#include <string.h>
class CName {
public:
enum {
sizeOfBuffer = 256
};
char m_szFirst[sizeOfBuffer];
char m_szLast[sizeOfBuffer];
public:
void SetName(char* pszFirst, char* pszLast) {
strcpy_s(m_szFirst, sizeOfBuffer, pszFirst);
strcpy_s(m_szLast, sizeOfBuffer, pszLast);
}
};
int main() {
// Allocate memory for the array
char* pCharArray = new char[CName::sizeOfBuffer];
strcpy_s(pCharArray, CName::sizeOfBuffer, "Array of characters");
// Deallocate memory for the array
delete [] pCharArray;
pCharArray = NULL;
// Allocate memory for the object
CName* pName = new CName;
pName->SetName("Firstname", "Lastname");
// Deallocate memory for the object
delete pName;
pName = NULL;
}
Se você usar o formato do operador new com "placement" - o formato com argumentos além do tamanho da alocação -, o compilador não dará suporte ao formato do operador delete com "placement" caso o construtor lance uma exceção. Por exemplo:
// expre_new_Operator2.cpp
// C2660 expected
class A {
public:
A(int) { throw "Fail!"; }
};
void F(void) {
try {
// heap memory pointed to by pa1 will be deallocated
// by calling ::operator delete(void*).
A* pa1 = new A(10);
} catch (...) {
}
try {
// This will call ::operator new(size_t, char*, int).
// When A::A(int) does a throw, we should call
// ::operator delete(void*, char*, int) to deallocate
// the memory pointed to by pa2. Since
// ::operator delete(void*, char*, int) has not been implemented,
// memory will be leaked when the deallocation cannot occur.
A* pa2 = new(__FILE__, __LINE__) A(20);
} catch (...) {
}
}
int main() {
A a;
}
Consulte também
Referência
Expressões com operadores unários
Tempo de vida de objetos alocados com novo