Partilhar via


Função operator new

Quando uma instrução como a seguinte é encontrada em um programa, ela converte-se em uma chamada para a função operator new:

Comentários

char *pch = new char[BUFFER_SIZE];

Se a solicitação é para zero bytes de armazenamento, operator new retorna um ponteiro para um objeto distinto (ou seja, chamadas repetidas para operator new retornam ponteiros diferentes). Se houver memória insuficiente para a solicitação de alocação, operator new retornará NULL ou lançará uma exceção (consulte Os operadores new e delete para obter mais informações).

Você pode escrever uma rotina que tenta liberar a memória e repetir a alocação; consulte _set_new_handler para obter mais informações. Para obter mais detalhes no esquema de recuperação, consulte o seguinte tópico, Administrando condições de memória insuficientes.

Os dois escopos para funções operator new são descritos na tabela a seguir.

Escopo para funções operator new

Operador

Escopo

::operator new

Global

class-name::operator new

Classe

O primeiro argumento para operator new deve ser do tipo size_t (um tipo definido em STDDEF.H), e o tipo de retorno sempre será void *.

A função global operator new é chamada quando o operador new é usada para alocar objetos de tipos internos, objetos de tipo de classe que não contêm funções operator new definidas pelo usuário e matrizes de qualquer tipo. Quando o operador new é usado para alocar objetos de um tipo de classe onde operator new é definido, operator new dessa classe é chamado.

Uma função operator new definida para uma classe é uma função de membro estático (que, portanto, não pode ser virtual) que oculta a função operator new global para objetos desse tipo de classe. Considere o caso em que new é usado para alocar e definir memória para um valor específico:

// spec1_the_operator_new_function1.cpp
#include <malloc.h>
#include <memory.h>

class Blanks
{
public:
    Blanks(){}
    void *operator new( size_t stAllocateBlock, char chInit );
};
void *Blanks::operator new( size_t stAllocateBlock, char chInit )
{
    void *pvTemp = malloc( stAllocateBlock );
    if( pvTemp != 0 )
        memset( pvTemp, chInit, stAllocateBlock );
    return pvTemp;
}
// For discrete objects of type Blanks, the global operator new function
// is hidden. Therefore, the following code allocates an object of type
// Blanks and initializes it to 0xa5
int main()
{
   Blanks *a5 = new(0xa5) Blanks;
   return a5 != 0;
}

O argumento fornecido entre parênteses para new é passado para Blanks::operator new como o argumento chInit. No entanto, a função global operator new é ocultada, fazendo com que o código como o seguinte gere um erro:

Blanks *SomeBlanks = new Blanks;

No Visual C++ 5.0 e anterior, tipos sem classe e todas as matrizes (independentemente de serem do tipo class) alocados usando o operador new sempre usam a função operator new global.

A partir do Visual C++ 5.0, o compilador oferece suporte aos operadores new e delete da matriz de membros em uma declaração de classe. Por exemplo:

// spec1_the_operator_new_function2.cpp
class MyClass
{
public:
   void * operator new[] (size_t)
   {
      return 0;
   }
   void   operator delete[] (void*)
   {
   }
};

int main() 
{
   MyClass *pMyClass = new MyClass[5];
   delete [] pMyClass;
}

Consulte também

Referência

Função operator delete

Operador new (C++)

Operador delete (C++)