¿Cuál es el uso de malloc
y free
cuando tenemos new
y delete
en C++. Supongo que la función de free
y delete
es la misma.¿Por qué utilizar malloc/free, cuando tenemos new/delete?
Respuesta
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.
Okk. pero ambos se usan para la administración de la memoria. ¿Cuándo usar new y cuándo usar malloc? – Parag
@Parag No "En C++, se supone que debes usar nuevo y eliminar" ¿responder eso? No use malloc/free. – hvd
@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) –
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 quemalloc
no lo hace, se tendría que hacer un adicionalmemset
o llamadas a funciones relacionadas post anmalloc
para inicializar la memoria asignada para hacer algo significativo.Una gran ventaja es que para
new
que no es necesario para comprobar si hayNULL
después de cada asignación, simplemente adjuntando los controladores de excepciones a hacer el trabajo que le ahorra de error redundante comprobar a diferenciamalloc
.
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
@hvd: 'new char []' tiene una sobrecarga (muy pequeña). A saber, almacena la cantidad de caracteres asignados en el bloque de memoria. –
@NicolBolas: ¿Y cómo 'gratis' sabe cuánto gratis? 'malloc' almacenará la cantidad de bytes asignados también. – MSalters
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()
.)
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. –
@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). –
- 1. ¿Por qué método equals() cuando tenemos == operador?
- 2. ¿Por qué deberíamos usar ui codificado cuando tenemos Specflow?
- 3. ¿Por qué tenemos cierres en JavaScript?
- 4. ¿Por qué tenemos punteros distintos de vacío?
- 5. ¿Por qué tenemos objetos invocables en python?
- 6. ¿Por qué tenemos que ir a JQuery?
- 7. ¿Por qué tenemos que establecer __block variable en nil?
- 8. ¿Por qué tenemos líneas nuevas en JavaScript miniaturizado?
- 9. ¿Por qué todavía necesitamos un archivo de resguardo .lib cuando tenemos la implementación .dll real?
- 10. Cuando tenemos clases de envoltorios, ¿por qué las primitivas son compatibles?
- 11. ¿Por qué razón tenemos la convención de nomenclatura de lower_case_with_underscores?
- 12. ¿Por qué utilizar Autorelease pool?
- 13. ¿Por qué no utilizar Html.EditorForModel()
- 14. ¿Por qué tenemos que llamar a UpdateWindow después de ShowWindow?
- 15. ¿Por qué tenemos una matriz dentada y una matriz multidimensional?
- 16. ¿Por qué no tenemos un // comentario en CSS?
- 17. ¿por qué tenemos que calcular el tiempo del año 1970?
- 18. ¿Por qué no tenemos <cstdfloat> en C++?
- 19. ¿Por qué utilizar la serialización
- 20. Por qué utilizar asp: HyperLink
- 21. MVC3 por qué utilizar html.editorfor
- 22. por qué utilizar include module cuando class_eval por sí solo sería suficiente
- 23. ¿Por qué no utilizar archivos XIB?
- 24. Cuando tenemos que usar DBNull.Value, null y "" en C# .Net?
- 25. ¿Por qué utilizar InnoDB sobre MySIAM
- 26. ¿Por qué no desea utilizar Cloud Computing
- 27. ¿Por qué utilizar BufferedReader en este caso?
- 28. ¿Por qué utilizar SQL Server bucle anidado
- 29. ¿Por qué utilizar JsHelper de CakePHP?
- 30. Por qué utilizar HandlerThread en Android
Es prorrogados del C ... – Mysticial