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.

Author: templatetypedef, 2011-02-09

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

  1. Asigna memoria para contener el objeto solicitado usando operator new.
  2. 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.
  3. 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.

 40
Author: templatetypedef,
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.

 4
Author: sharptooth,
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