26

Estaba viendo la firma del nuevo operador. Que es:nuevo operador para asignación de memoria en el montón

void* operator new (std::size_t size) throw (std::bad_alloc); 

Pero cuando utilizamos este operador, nunca usamos un elenco. es decir

int *arr = new int; 

Así pues, cómo C++ convertir un puntero de tipo void* a int* en este caso. Porque, incluso malloc devuelve un void* y tenemos que utilizar explícitamente un elenco.

Respuesta

39

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í:

  1. asignar memoria para contener el objeto solicitado mediante el uso de operator new.
  2. 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.
  3. 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.

+0

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

+0

@ GMan- ¡Gracias por detectar eso! Mi error. Lo arreglaré. – templatetypedef

+0

Muy buena explicación. Muchas gracias !!! –

4

Confunde la expresión new con la función operator new(). Cuando se compila el primero, el compilador entre otras cosas genera una llamada a la función operator new() y pasa el tamaño suficiente para contener el tipo mencionado en la expresión new y luego se devuelve un puntero de ese tipo.

+0

A quien haya votado negativamente, ¿qué pasa con esta respuesta? Parece perfectamente correcto. – templatetypedef

Cuestiones relacionadas