Pregunta

Duplicado de: ¿En qué casos utilizo malloc vs nuevo?

Solo releyendo esta pregunta:
¿Cuál es la diferencia entre " ; nuevo " y " malloc " y " calloc " en C ++?

Revisé las respuestas pero nadie respondió la pregunta:

  • ¿Cuándo usaría malloc en lugar de nuevo?

Hay un par de razones (puedo pensar en dos).
Deja que el mejor flote hasta la cima.

¿Fue útil?

Solución

Una pareja que viene a la mente:

  • Cuando necesite que el código sea portátil entre C ++ y C.
  • Cuando asignas memoria en una biblioteca a la que se puede llamar desde C, y el código C tiene que liberar la asignación.

Otros consejos

De las Preguntas frecuentes de Stroustrup en new / malloc que publiqué en ese hilo:

  

Siempre que use malloc () debe considerar la inicialización y la conversión del puntero de retorno a un tipo adecuado. También deberá considerar si obtuvo el número de bytes adecuado para su uso. No hay diferencia de rendimiento entre malloc () y nuevo cuando se tiene en cuenta la inicialización.

Esto debería responder a tu pregunta.

La mejor razón que se me ocurre para usar malloc en C ++ es cuando interactúo con una API C pura. Algunas API de C con las que he trabajado se apropian de la memoria de ciertos parámetros. Como tales, son responsables de liberar la memoria y, por lo tanto, la memoria debe poder liberarse de forma gratuita. Malloc trabajará para este puprose pero no necesariamente nuevo.

En C ++, casi nunca. por lo general, new es una envoltura alrededor de malloc que llama a los constructores (si corresponde).

Sin embargo, al menos con Visual C ++ 2005 o superior, utilizando malloc en realidad puede resultar en vulnerabilidades de seguridad en comparación con las nuevas .

Considera este código:

MyStruct* p = new MyStruct[count];
MyStruct* p = (MyStruct*)malloc(count* sizeof(MyStruct));

Parecen equivalentes. Sin embargo, el código para las primeras verificaciones de un desbordamiento de enteros en count * sizeof (MyStruct). Si el recuento proviene de una fuente no reforzada, puede causar un desbordamiento de enteros que produce una pequeña cantidad de memoria. asignado, pero luego cuando usas el recuento superas el búfer.

Todo el mundo ha mencionado (usando palabras ligeramente diferentes) cuando usa una biblioteca de C que usará free () y hay muchas de ellas alrededor.

La otra situación que veo es:

Al activar su propia gestión de memoria (porque, por alguna razón, haber descubierto a través del modelado el valor predeterminado no es suficiente). Puede asignar bloques de memoria con malloc y la inicialización de los objetos dentro de las agrupaciones utilizando una nueva ubicación.

Una de las razones es que en C ++, puede sobrecargar al nuevo operador.

Si desea asegurarse de usar la asignación de memoria de la biblioteca del sistema en su código, puede usar malloc.

Un programador de C ++ raramente, si es que alguna vez, necesita llamar a malloc. La única razón para hacerlo es una API mal construida que esperaba que pasara a la memoria de Malloc'd porque estaría haciendo lo gratuito. En su propio código, nuevo siempre debe ser igual a malloc.

Si la memoria debe ser liberada por free () (en su código o en el de otra persona), es muy necesario que use malloc.

De lo contrario no estoy seguro. Un caso artificial es cuando no desea que el (los) destructor (es) se ejecute en la salida, pero en ese caso probablemente debería tener objetos que no tengan un controlador de operación de todos modos.

Puede usar malloc cuando no quiera tener que preocuparse por detectar excepciones (o usar una versión nueva no lanzada).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top