nuevo operador para la asignación de memoria en el montón
Estaba mirando la firma del nuevo operador. Que es:
void* operator new (std::size_t size) throw (std::bad_alloc);
Pero cuando usamos este operador, nunca usamos un molde. i. e
int *arr = new int;
Entonces, cómo C++ convierte un puntero de tipo void*
a int*
en este caso. Porque, even malloc
devuelve un void*
y necesitamos usar explícitamente un cast.
2 answers
Hay una diferencia muy sutil en C++ entre operator new
y el operador new
. (Lee eso otra vez... el pedido es importante!)
La función operator new
es el análogo de C++ de la función malloc
de C. Es un asignador de memoria cruda 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. Para ejemplo:
void* memory = operator new(137); // Allocate at least 137 bytes
El operador new
es una palabra clave que es responsable de asignar memoria para un objeto e invocar su constructor. Esto es lo que se encuentra más comúnmente en el código C++. Cuando escribes
int* myInt = new int;
Está utilizando el nuevo operador para asignar un nuevo entero. Internamente, el operador new
funciona más o menos así:
- Asigna memoria para contener el objeto solicitado usando
operator new
. - Invoca el constructor de objetos, si lo hay. Si esto lanza una excepción, libera la memoria anterior con
operator delete
, luego propaga la excepción. - Devuelve un puntero al objeto recién construido.
Debido a que el operador new
y operator new
son separados, es posible usar la palabra clave new
para construir objetos sin asignar memoria. Por ejemplo, la famosa ubicación new le permite construir un objeto en una dirección de memoria arbitraria en la memoria proporcionada por el usuario. Para 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.'
Sobrecargar el operador new
definiendo una función personalizada operator new
le permite usar new
de esta manera; especifique cómo se produce la asignación, y el compilador de C++ lo conectará al operador new
.
En caso de curiosidad, la palabra clave delete
funciona de la misma manera. Hay una función de desasignación llamada operator delete
responsable de disponer de memoria, y también un operador delete
responsable de invocar destructores de objetos y liberar memoria. No obstante, operator new
y operator delete
se puede usar fuera de estos contextos en lugar de C malloc
y free
, por ejemplo.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-09 06:24:45
Se 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-09 06:06:08