2012-03-07 10 views
11

La definición de nuevo en el < nueva> cabecera es:¿Por qué no se requiere un molde para el puntero a pesar de que malloc lo requiere?

void* operator new(size_t); 

y la definición de malloc es como se ha dicho:

void* malloc(size_t); 

Ahora, como C++ es un lenguaje fuertemente tipado, se requiere una emitido por el programador para convertir un puntero void * al tipo que el programador requiere ... En malloc, tenemos que realizar un cast, pero no en new, aunque ambos devuelven un puntero void *. ¿Por qué?

+0

mira esto http://www.codeproject.com/Articles/6555/To-new-is-C-To-malloc -is-C-To-mix-them-is-sin – pyCthon

+0

también este http://stackoverflow.com/questions/184537/in-what-cases-do-i-use-malloc-vs-new – pyCthon

+5

También echa un vistazo : http://stackoverflow.com/q/1885849/1155650 –

Respuesta

12

Porque cuando usa new, usa (normalmente) una "nueva expresión", que asigna e inicializa un objeto. A continuación, asigna la dirección de ese objeto a un puntero a un objeto del mismo tipo (o principal), que no requiere conversión. Una nueva expresión normal (es decir, no una ubicación nueva) invocará operator new internamente pero el resultado de la nueva expresión es no simplemente el resultado de operator new.

Si invoca directamente al operator new, debe generar su resultado para asignar el valor de retorno a un puntero no nulo, como debe hacer con el resultado de malloc.

+1

¿Puede decirme más sobre la nueva expresión ???? – bhuwansahni

+2

La respuesta aceptada [y brillante :-)] a la pregunta a la que @Rohit se vinculó entra en más detalles al respecto. –

5

Porque tiene la impresión incorrecta de cómo usar malloc. No recibe el tipo como argumento, sino solo el tamaño del tipo.

C y C++ son idiomas diferentes. En C, no necesita convertir el void* de malloc en el tipo de puntero de destino. En C++, el operador new está profundamente integrado en el lenguaje de tal forma que siempre devuelve un valor que corresponde al tipo que usted dio en el argumento.

La regla es bastante simple use new para C++ y malloc para C, no los mezcle.

+0

¿Cómo recibe nuevo el tipo como argumento? – bhuwansahni

+1

@bhuwansahni, 'new' es un operador no una función. En el lugar donde lo usas, siempre le das el tipo del objeto que se va a asignar y construir. Depende del compilador hacer el enlace. En C para una llamada a 'malloc' solo das el tamaño. –

+0

Sí, pero la declaración del nuevo operador no lo refleja, ¿por qué ??? – bhuwansahni

1

Porque la llamada operator new es solo un paso generado en toda la cadena cuando se invoca new.

Al hacer s=new my_type(args);, el compilador se expandirá a que:

s = (my_type*)my_type.operator new(sizeof(my_type)); 
s.my_type(args); //Constructor call 
Cuestiones relacionadas