novo operador (C++)
Aloca memória para um objeto ou matriz de objetos do nome do tipo armazenamento de caixa de gratuito e retorna um ponteiro devidamente digitado e diferente de zero para o objeto.
[::] new [placement] new-type-name [new-initializer]
[::] new [placement] ( type-name ) [new-initializer]
Comentários
Se não houver êxito, nova retorna zero ou lança uma exceção; consulte o novo e excluir os operadores de para obter mais informações.Você pode alterar esse comportamento padrão, escrevendo uma rotina de tratamento de exceção personalizada e chamar o _set_new_handler função de biblioteca de tempo de execução com o seu nome de função como seu argumento.
Para obter informações sobre como criar um objeto no heap gerenciado, consulte gcnew.
Quando nova é usado para alocar memória para um objeto de classe do C++, o construtor do objeto é chamado depois que a memória é alocada.
Use o Excluir operador para desalocar a memória alocada com o nova operador.
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 constantes que são avaliados como valores positivos; a dimensão da matriz de extrema esquerda pode ser qualquer expressão avaliada como um valor positivo.Ao alocar uma matriz usando o nova operador, a primeira dimensão pode ser zero — o nova operador retorna um ponteiro exclusivo.
char (*pchar)[10] = new char[dim][10];
delete [] pchar;
O nome do tipo não pode conter const, volatile, declarações de classe, ou declarações de enumeração.Portanto, a expressão a seguir é ilegal:
volatile char *vch = new volatile char[20];
O nova operador não aloca os tipos de referência porque eles não são objetos.
O nova operador não pode ser usado para alocar uma função, mas ele pode ser usado para alocar os 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 nova sem quaisquer argumentos extras e compilação com o /GX, /EHa, ou /EHs opção, o compilador irá gerar o código para chamar o operador Excluir se o construtor lançará uma exceção.
A lista a seguir descreve os elementos de gramática de nova:
posicionamento
Fornece uma maneira de passar argumentos adicionais se você sobrecarregar nova.nome do tipo
Especifica o tipo a ser alocada; ele pode ser um tipo interno ou definido pelo usuário.Se a especificação de tipo é complicada, ele pode estar entre parênteses para forçar a ordem de ligação.inicializador
Fornece um valor para o objeto inicializado.Inicializadores não podem ser especificados para arrays.O nova operador irá criar matrizes de objetos, somente se a classe tem 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 libera-los.
// 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 a nova forma de colocação da nova operador, o formulário com argumentos além do tamanho da alocação, o compilador não oferece suporte a uma forma de colocação da Excluir operador se o construtor lançará 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 novos