Hacemos una revisión profunda cada uno de los posts de nuestra página web con el objetivo de mostrarte en todo momento información con la mayor veracidad y certera.
Solución:
No hay new
/delete
expresión en c
Los equivalentes más cercanos son los malloc
y free
funciones, si ignora los constructores/destructores y escribe seguridad.
#include
int* p = malloc(sizeof(*p)); // int* p = new int;
...
free(p); // delete p;
int* a = malloc(12*sizeof(*a)); // int* a = new int[12];
...
free(a); // delete[] a;
Tenga en cuenta que los constructores pueden generar excepciones en C++. El equivalente de player* p = new player();
sería algo así en C.
struct player *p = malloc(sizeof *p);
if (!p) handle_out_of_memory();
int err = construct_player(p);
if (err)
free(p);
handle_constructor_error();
El equivalente de delete p
es más simple, porque los destructores nunca deben “lanzar”.
destruct(p);
free(p);
Uso de new
y delete
en C++ combina dos responsabilidades: asignar/liberar memoria dinámica e inicializar/liberar un objeto.
Como dicen todas las demás respuestas, la forma más común de asignar y liberar memoria dinámica es llamar malloc
y free
. También puede usar funciones específicas del sistema operativo para obtener una gran cantidad de memoria y asignar sus objetos en eso, pero eso es más raro, solo si tiene requisitos bastante específicos que malloc no satisface.
En C, la mayoría de las API proporcionarán un par de funciones que cumplen los otros roles de new
y delete
.
Por ejemplo, la API de archivo utiliza un par de funciones de apertura y cierre:
// C++
fstream* fp = new fstream("c:\test.txt", "r");
delete fp;
// C
FILE *fp=fopen("c:\test.txt", "r");
fclose(fp);
Puede ser que fopen
usos malloc
para asignar el almacenamiento para el FILE
struct, o puede asignar estáticamente una tabla para el número máximo de punteros de archivo al inicio del proceso. El punto es que la API no requiere que el cliente use malloc
y free
.
Otras API brindan funciones que solo realizan la inicialización y la liberación de parte del contrato, equivalente al constructor y al destructor, lo que permite que el código del cliente use automático, static o almacenamiento dinámico. Un ejemplo es la API de pthreads:
pthread_t thread;
pthread_create( &thread, NULL, thread_function, (void*) param);
Esto permite al cliente una mayor flexibilidad, pero aumenta el acoplamiento entre la biblioteca y el cliente – el cliente necesita saber el tamaño de la pthread_t
type, mientras que si la biblioteca maneja tanto la asignación como la inicialización, el cliente no necesita saber el tamaño del tipo, por lo que la implementación puede variar sin cambiar el cliente en absoluto. Ninguno introduce tanto acoplamiento entre el cliente y la implementación como lo hace C++. (A menudo es mejor pensar en C++ como un lenguaje de metaprogramación de plantilla con vtables que como un lenguaje OO)