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;
}