Hay una diferencia muy sutil en C++ entre operator new
y el operador new
. (Lea eso otra vez ... ¡el orden es importante!)
La función operator new
es la función análoga de C++ malloc
de C. Es un asignador de memoria en bruto cuya responsabilidad es únicamente producir un bloque de memoria sobre el cual construir objetos. No invoca a ningún constructor, porque ese no es su trabajo. Por lo general, no verá operator new
utilizado directamente en el código C++; se ve un poco raro Por ejemplo:
void* memory = operator new(137); // Allocate at least 137 bytes
El operador new
es una palabra clave que es responsable de la asignación de memoria para un objeto y la invocación de su constructor. Esto es lo que se encuentra con mayor frecuencia en el código C++. Cuando escriba
int* myInt = new int;
Está utilizando el nuevo operador para asignar un nuevo entero. Internamente, el operador new
funciona más o menos así:
- asignar memoria para contener el objeto solicitado mediante el uso de
operator new
.
- Invoque el constructor del objeto, si lo hay. Si esto arroja una excepción, libere la memoria anterior con
operator delete
, luego propague la excepción.
- Devuelve un puntero al objeto recién construido.
Debido a que el operador new
y operator new
están separados, es posible utilizar la palabra clave new
para construir objetos sin llegar a cualquier reserva de memoria. Por ejemplo, la famosa ubicación nueva le permite construir un objeto en una dirección de memoria arbitraria en la memoria proporcionada por el usuario. Por ejemplo:
T* memory = (T*) malloc(sizeof(T)); // Allocate a raw buffer
new (memory) T(); // Construct a new T in the buffer pointed at by 'memory.'
La sobrecarga del operador new
mediante la definición de una costumbre operator new
función le permite utilizar new
de esta manera; especifica cómo se produce la asignación, y el compilador de C++ lo conectará al operador new
.
En caso de que tenga curiosidad, la palabra clave delete
funciona de la misma manera.Hay una función de desasignación llamada operator delete
responsable de la eliminación de memoria, y también un operador delete
responsable de invocar objetos destructores y liberar memoria. Sin embargo, operator new
y operator delete
se pueden usar fuera de estos contextos en lugar de C malloc
y free
, por ejemplo.
El paso dos debe ser "Invocar el constructor del objeto, si corresponde. Si esto arroja * cualquier excepción *, libere la memoria anterior y propague la excepción". – GManNickG
@ GMan- ¡Gracias por detectar eso! Mi error. Lo arreglaré. – templatetypedef
Muy buena explicación. Muchas gracias !!! –