Partilhar via


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

Palavras-chave C++

Tempo de vida de objetos alocados com novo

Inicializando objetos alocados com novo

Como new funciona

Função operator new