2012-04-02 14 views

Respuesta

8

No son lo mismo. new llama al constructor, malloc solo asigna la memoria.

Además, es comportamiento indefinido mezcla de los dos (es decir, usando new con free y malloc con delete).

En C++, se supone que debes usar new y delete, malloc y free están allí por razones de compatibilidad con C.

+0

Okk. pero ambos se usan para la administración de la memoria. ¿Cuándo usar new y cuándo usar malloc? – Parag

+4

@Parag No "En C++, se supone que debes usar nuevo y eliminar" ¿responder eso? No use malloc/free. – hvd

+0

@hvd: Ese no es el consejo correcto. Su lógica de usar 'new' y' delete' en C++ no es del todo correcta (Especialmente después de la respuesta de Nicol a su comentario) –

5

En C++, rara vez es útil que se podría usar malloc & free en lugar de new & delete.

Un escenario que se me ocurre es:

Si no desea conseguir su memoria inicializado por llamadas a constructores implícitas, y sólo tiene una asignación de memoria asegurada para placement new entonces es perfectamente posible utilizar malloc y free en lugar de new y delete. Por otra parte, es importante saber que malloc y new no son iguales.
dos diferencias importantes hacia arriba son:

  • new garantías callng de constructores de la clase para inicializar los miembros de la clase, mientras que malloc no lo hace, se tendría que hacer un adicional memset o llamadas a funciones relacionadas post an malloc para inicializar la memoria asignada para hacer algo significativo.

  • Una gran ventaja es que para new que no es necesario para comprobar si hay NULL después de cada asignación, simplemente adjuntando los controladores de excepciones a hacer el trabajo que le ahorra de error redundante comprobar a diferencia malloc.

+0

Claro, pero una llamada explícita a 'operator new' basta para eso, o' new char [n] '. (No hay problema con el uso de malloc para eso, pero no es necesario). – hvd

+2

@hvd: 'new char []' tiene una sobrecarga (muy pequeña). A saber, almacena la cantidad de caracteres asignados en el bloque de memoria. –

+0

@NicolBolas: ¿Y cómo 'gratis' sabe cuánto gratis? 'malloc' almacenará la cantidad de bytes asignados también. – MSalters

3

En primer lugar, cuando se habla de new y delete, supongo que te refieres a los expresiones, y no los operator new y operator delete funciones. Las expresiones new y delete no están relacionadas con malloc y free, y solo administran la memoria de manera incidental; su función principal es administrar la duración del objeto: una expresión new llamará a la función operator new para obtener memoria y luego llamar al constructor; una expresión delete llamará al destructor antes de llamar operator delete a liberar la memoria.En su mayor parte, los objetos deben ser creados, y no simplemente asignados, lo que significa usar las expresiones exclusivamente.

Existen algunos casos excepcionales en los que se desea separar la asignación y la inicialización (creación); implementar cosas como std::vector es un ejemplo clásico de , donde se asignará para muchos objetos de una vez, pero solo construye uno a la vez. En tales casos, usará la función operator new para la asignación y la colocación nueva para la inicialización; en el en el otro extremo, llamará explícitamente al constructor (algo así como p->~T()) para destruirlo, y utilizará la función operator delete para liberar la memoria.

De forma manual, solo puedo pensar en dos casos en los que utilizaría malloc y free en C++. La primera es implementar sus propios reemplazos de las funciones ::operator new y ::operator delete. (A menudo reemplazar lo global y ::operator new::operator delete con la depuración versiones, que las asignaciones traza, poner zonas de guardia alrededor de la memoria asignada, etc.) que el otro está en la interacción con una biblioteca legado escrito en C: si la biblioteca dice pasar un puntero a la memoria asignada por malloc (porque va a liberar él mismo usando free), o más comúnmente , devuelve un puntero a la memoria asignada por malloc, que que se espera que liberar, a continuación, debe utilizar malloc y free . (Los mejores bibliotecas se proporcionan sus propios asignación y desasignación funciones, que hacen más o menos lo que los operadores new y delete hacen, pero siempre habrá cosas como strdup().)

+0

Para aquellos interesados ​​en el primer uso que se indica en la respuesta, [¿Cómo debo escribir ISO C++ Estándar nuevo y eliminar operadores personalizados?] (Http://stackoverflow.com/ preguntas/7194127/how-should-i-write-iso-c-standard-conform-custom-new-and-delete-operators) es una buena lectura. –

+0

@Als Para un 100% de conformidad, puede usar el lenguaje 'malloc' y' free', y nada más. Siendo realistas, hay muchas funciones que simplemente nunca asignarán memoria (como 'memset'); Los consideraría seguros también. Prácticamente, probablemente estés a salvo con toda la biblioteca C, pero mis implementaciones de depuración verifican la recursión, y no utilizas más que 'malloc',' memset' y 'memcpy' si se llama' :: operator new' recursivamente (así que si 'fprintf' usa' :: operator new', no terminaré con recursión infinita). –

Cuestiones relacionadas