Compartilhar via


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

Palavras-chave C++

Tempo de vida de objetos alocados com novos

Inicializando objetos alocados com novos

Funciona como nova

operador nova função