2012-01-22 15 views
8

En C++ no está permitido asignar un puntero void * a ningún puntero integral sin un molde explícito. Esto requiere el uso de un static_cast.¿Por qué el nuevo operador puede devolver * vacío a cada tipo de puntero?

Pero lo que es con esto:

int* iptr = new int; 

Yo sé que el nuevo operador se define de la siguiente manera:

void* operator new(size_t); 

¿Cómo C++ manejar esto? Sé que esta es una pregunta básica, pero importante. También sé que el código de bajo nivel debe usar nulo. Pero, ¿cómo puede esta tarea ser legal? iptr es un puntero a un int y new devuelve un puntero a void, que debe desencadenar un mensaje como "error: conversión no válida de 'void *' a 'int *' [-fpermissive]".

+5

Lea esto: http://stackoverflow.com/questions/2697892/what-is-return-type-of-new-in-c; operador nuevas y nuevas expresiones no son lo mismo. – Mat

+1

Además, este: http://stackoverflow.com/questions/2941888/how-operator-new-calls-the-constructor-of-class - Creo que ambos responden a su pregunta. – Mat

+0

También: gracias a ti Mat! – Peter

Respuesta

19

Ha confundido el nuevo operador y el operador nueva función. No hay problema, todos lo hacen. Son casi lo mismo, excepto que son diferentes.

La función void* operator new(size_t) toma un bloque de memoria sin formato del árbol en el que crece y lo devuelve al programa.

void* raw_memory = ::operator new(42); 

Es una función ordinaria con el nombre un tanto extraño.

El nuevo operador no es una función ni una función de llamada. Es una construcción de lenguaje por separado. Toma memoria en bruto (normalmente, una devuelta por la función void* operator new(size_t)) y la convierte en un objeto llamando a un constructor. Luego devuelve un puntero correctamente tipeado al objeto recién creado.

Fish* f = new Fish; 

ACTUALIZACIÓN Naturalmente, también existe la Suprimir operador (lo contrario del operador nuevo) y la función void operator delete(void*) (lo contrario de la función void* operator new(size_t)).

También están los nueva [] operador, el delete [] operador, la función void* operator new[](size_t) y la función void operator delete[](void*); se ocupan de matrices de objetos (a diferencia de los objetos individuales).

También se conocen los llamados "nuevos emplazamientos" que no llaman a ninguna de las funciones operator new para la memoria nueva, sino que requieren un puntero explícito para la memoria sin procesar. No tienen los correspondientes formularios incorporados de "eliminación". Puedes enrollar el tuyo si lo deseas, pero me niego a hablar sobre esto mientras estoy sobrio.

+1

+1 por "Son casi iguales, excepto que son diferentes". –

+0

¿Utiliza 'delete' en ambos? –

+0

@Seth: No, 'delete void_ptr;' es un comportamiento indefinido.Utilizaría ':: operator delete (void_ptr_from_operator_new);' – Xeo

Cuestiones relacionadas