operador new (Función)
Cuando una instrucción como la siguiente se encuentra en un programa, se convierte a una llamada a la función operator new:
Comentarios
char *pch = new char[BUFFER_SIZE];
Si la solicitud es para cero bytes de almacenamiento, operator new devuelve un puntero a un objeto distinto (es decir, las llamadas repetidas a operator new devuelven punteros diferentes). Si hay memoria suficiente para la solicitud de asignación, operator new devuelve NULL o inicia una excepción (vea Los operadores new y delete para obtener más información).
Puede escribir una rutina que intente liberar memoria y reintente la asignación; vea _set_new_handler para obtener más información. Para obtener más detalles sobre el esquema de recuperación, vea el tema siguiente, Controlar condiciones de memoria insuficiente.
Los dos ámbitos para las funciones operator new se describen en la tabla siguiente.
Ámbito de funciones operator new
Operador |
Ámbito |
---|---|
::operator new |
Global |
class-name::operator new |
Clase |
El primer argumento de operator new debe ser de tipo size_t (un tipo definido en STDDEF.H), y el tipo de valor devuelto es siempre void *.
Se llama a la función global operator new cuando el operador new se usa para asignar objetos de tipos integrados, objetos de tipo de clase que no contienen funciones operator new definidas por el usuario y matrices de cualquier tipo. Cuando el operador new se usa para asignar objetos de un tipo de clase donde se define operator new , se llama a la función operator new de esa clase.
Una función operator new definida para una clase es una función miembro estática (que no puede, por consiguiente, ser virtual) que oculta la función global operator new para los objetos de ese tipo de clase. Considere que se usa new para asignar y establecer la memoria en un valor determinado:
// 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;
}
El argumento proporcionado entre paréntesis a new se pasa a Blanks::operator new como argumento chInit. Sin embargo, se oculta la función global operator new, haciendo que el código como el siguiente genere un error:
Blanks *SomeBlanks = new Blanks;
En Visual C++ 5.0 y versiones anteriores, los tipos no de clase y todas las matrices (independientemente de si son de tipo class) asignados mediante el operador new utilizaban siempre la función global operator new.
A partir de Visual C++ 5.0, el compilador admite los operadores new y delete de matriz de miembros en una declaración de clase. Por ejemplo:
// 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;
}