¿Cuál es la diferencia entre nuevo/eliminar y malloc/gratis?

8 minutos de lectura

¿Cual es la diferencia entre nuevoeliminar y mallocgratis
Sr. base de datos

Cuál es la diferencia entre new/delete y malloc/free?

Relacionado (¿duplicado?): ¿En qué casos uso malloc vs new?

  • Vea también mi respuesta detallada aquí.

    – Jonathan H.

    24 de diciembre de 2014 a las 12:19

new / delete

  • Asignar/liberar memoria
    1. Memoria asignada desde ‘Free Store’.
    2. Devuelve un puntero completamente escrito.
    3. new (versión estándar) nunca devuelve un NULL (lanzará al fracaso).
    4. Se llaman con Type-ID (el compilador calcula el tamaño).
    5. Tiene una versión explícita para manejar arreglos.
    6. La reasignación (para obtener más espacio) no se maneja de manera intuitiva (debido al constructor de copias).
    7. Ya sea que llamen malloc / free está definida la implementación.
    8. Puede agregar un nuevo asignador de memoria para lidiar con poca memoria (std::set_new_handler).
    9. operator new / operator delete puede anularse legalmente.
    10. Constructor/destructor utilizado para inicializar/destruir el objeto.

malloc / free

  • Asignar/liberar memoria
    1. Memoria asignada desde ‘Heap’.
    2. Devuelve un void*.
    3. Devoluciones NULL sobre el fracaso
    4. Debe especificar el tamaño requerido en bytes.
    5. La asignación de matrices requiere el cálculo manual del espacio.
    6. La reasignación de una mayor cantidad de memoria es simple (no hay que preocuparse por el constructor de copias).
    7. Ellos van a NO llamada new / delete.
    8. No hay forma de empalmar el código de usuario en la secuencia de asignación para ayudar con poca memoria.
    9. malloc / free lata NO anularse legalmente.

Tabla de comparación de las características:

Rasgo new / delete malloc / free
Memoria asignada desde ‘Tienda gratis’ ‘Montón’
Devoluciones Puntero completamente escrito void*
en caso de falla Lanza (nunca regresa) NULL) Devoluciones NULL
Tamaño requerido Calculado por el compilador Debe especificarse en bytes
Manejo de arreglos Tiene una versión explícita. Requiere cálculos manuales
reasignación No se maneja intuitivamente Simple (sin constructor de copia)
Llamada de reversa Implementación definida No
Casos de poca memoria Puede agregar un nuevo asignador de memoria No manejado por código de usuario
reemplazable No
Uso de constructor / destructor No

Técnicamente, la memoria asignada por new proviene de la ‘Tienda gratuita’ mientras que la memoria asignada por malloc proviene del ‘Montón’. Si estas dos áreas son iguales es un detalle de implementación, que es otra razón por la que malloc y new no se puede mezclar

  • ¿Alguien puede editar para elaborar sobre la “Tienda gratuita” en lugar del montón? Un montón de procesos es un concepto bien conocido a nivel de sistema operativo independiente del idioma (?); ¿De dónde viene la “Tienda Gratis”?

    – einpoklum

    21 de febrero de 2016 a las 15:26

  • @einpoklum: Son solo nombres de áreas de memoria. Tampoco tiene nada que ver con el concepto de lenguaje conocido como “montón” o el concepto de sistema operativo de “montón de procesos”. C++ se define deliberadamente para ser plataforma/SO/compilador neutral. Por lo tanto, usar un concepto de sistema operativo específico como “montón de procesos” socavaría la flexibilidad del estándar.

    – Martín York

    21 de febrero de 2016 a las 17:06


  • @winterlight: Eso solía ser cierto, pero ya no. Ver: linux.die.net/man/3/free If ptr is NULL, no operation is performed.

    – Martín York

    19 de junio de 2016 a las 17:12

  • @LokiAstari Parece que ‘montón’, ‘almacenamiento gratuito’ y ‘memoria/almacenamiento dinámico’ son sinónimos: en Bjarne Stroustrup’s Un recorrido por C++dice “La new El operador asigna memoria desde el tienda gratis (también conocido como memoria dinámica y montón). El estándar C++ 14, sección 3.7.4 sobre Almacenamiento dinámico dice “Los objetos se pueden crear dinámicamente durante la ejecución del programa (1.9), usando nuevas expresiones (5.3.4), y se pueden destruir usando eliminar-expresiones”.

    –Max Heiber

    7 de enero de 2017 a las 15:07


  • @mheiber: Significa que pueden ser iguales. Y varias implementaciones implementan new llamando a malloc (tenga en cuenta que al revés no está permitido explícitamente). Pero varias implementaciones mantienen esas áreas de memoria completamente separadas. La razón por la que también los mantuvo separados es que esto permite optimizar el código de administración de memoria de C++ de una manera diferente a la administración de memoria de C. El punto es: podrían ser lo mismo, pero no puedes asumir que lo son.

    – Martín York

    9 de enero de 2017 a las 17:43

1647554170 360 ¿Cual es la diferencia entre nuevoeliminar y mallocgratis
Trampa

La diferencia más relevante es que el new El operador asigna memoria y luego llama al constructor, y delete llama al destructor y luego desasigna la memoria.

  • Estrictamente hablando, el nuevo operador solo asigna la memoria. Es la nueva expresión la que llama al nuevo operador y luego ejecuta el constructor en la memoria asignada.

    –Don Wakefield

    27 de octubre de 2008 a las 23:36

  • Otra diferencia es dónde se asigna la memoria. Hace poco vi en alguna parte que malloc/free opera en el montón, mientras que new/delete opera en otra área de la memoria cuyo nombre se me escapa ahora. (Sin embargo, baste decir que esa otra área probablemente se puede considerar como otro montón).

    – RobH

    30 de abril de 2009 a las 19:29

  • @mgb: Sí, tiene razón en que los objetos se asignan en el “montón de la aplicación” o en la pila. Pero @RobH se refiere a lo que el estándar llama diferentes partes del “Montón de aplicaciones”. Existe el “Montón”, que es desde donde malloc asigna memoria y “Free Store”, desde donde new asigna memoria. Aunque en algunos implementaciones estas áreas se superponen (este es un detalle de implementación).

    – Martín York

    28 de noviembre de 2009 a las 2:01

  • Su declaración es 100% correcta pero simplemente no responde la pregunta formulada, vea la respuesta a continuación, hay una razón por la cual tiene más votos que la suya.

    – Murali

    20 de enero de 2010 a las 16:58

  • Todo lo que estaba tratando de decir era que debería haber al menos alguna mención de malloc/free para que califique como una comparación de la que carecía su respuesta. Sin embargo, es una declaración relevante y precisa, por lo que los votos a favor, espero que entiendan mi punto. De todos modos, si SO me permitiera retirar mi voto negativo, lo haría de todo corazón.

    – Murali

    22 de enero de 2010 a las 3:06


new llama al ctor del objeto, delete llamar al dtor.

malloc & free simplemente asigne y libere memoria sin procesar.

  • ¿A qué te refieres con memoria en bruto?

    – Destructor

    5 de enero de 2015 a las 15:50

  • A la memoria en bruto no se le ha hecho nada. Todavía no se ha construido ningún objeto en él, no se ha copiado nada en él y, en la mayoría de los casos, los contenidos anteriores no se han sobrescrito.

    – James Curran

    5 de enero de 2015 a las 23:04

1647554170 953 ¿Cual es la diferencia entre nuevoeliminar y mallocgratis
Treb

new/delete es C++, malloc/free proviene del buen viejo C.

En C++, new llama a un constructor de objetos y delete llama al destructor.

malloc y freeprovenientes de la edad oscura antes de OO, solo asignan y liberan la memoria, sin ejecutar ningún código del objeto.

¿Cual es la diferencia entre nuevoeliminar y mallocgratis
encriptado

En C++ new/delete llamar al Constructor/Destructor en consecuencia.

malloc/free simplemente asigne memoria del montón. new/delete asignar memoria también.

¿Cual es la diferencia entre nuevoeliminar y mallocgratis
Pato Donald

La principal diferencia entre new y malloc es que new invoca al constructor del objeto y la correspondiente llamada a delete invoca al destructor del objeto.

Hay otras diferencias:

  • new es de tipo seguro, malloc devuelve objetos de tipo void*

  • new lanza una excepción en caso de error, malloc devoluciones NULL y establece errno

  • new es un operador y se puede sobrecargar, malloc es una función y no se puede sobrecargar

  • new[]que asigna matrices, es más intuitivo y seguro para tipos que malloc

  • malloc-las asignaciones derivadas se pueden redimensionar mediante realloc, new-las asignaciones derivadas no se pueden redimensionar

  • malloc puede asignar un trozo de memoria de N bytes, new se le debe pedir que asigne una matriz de, digamos, char tipos

Mirando las diferencias, un resumen es malloc es C-esque, new es C++-esque. Use el que se sienta adecuado para su base de código.

Aunque es legal que new y malloc se implementen utilizando diferentes algoritmos de asignación de memoria, en la mayoría de los sistemas new se implementa internamente mediante malloc, lo que no genera diferencias a nivel del sistema.

1647554172 410 ¿Cual es la diferencia entre nuevoeliminar y mallocgratis
Marius Bancila

Las únicas similitudes son que malloc/new ambos devuelven un puntero que se dirige a alguna memoria en el montón, y ambos garantizan que una vez que se haya devuelto dicho bloque de memoria, no se devolverá de nuevo a menos que lo libere o elimine primero. Es decir, ambos “asignan” memoria.

Sin embargo, new/delete realizar otro trabajo arbitrario además, a través de constructores, destructores y sobrecarga de operadores. malloc/free solo asignar y liberar memoria.

De hecho, new es lo suficientemente personalizable que no necesariamente devuelve memoria del montón, o incluso asigna memoria en absoluto. Sin embargo, el valor predeterminado new lo hace.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad