web-dev-qa-db-fra.com

Quel est l'équivalent de new / delete de C ++ en C?

Quel est l'équivalent de new/delete de C++ en C?

Ou c'est la même chose en C/C++?

25
httpinterpret

Il n'y a pas d'expression new/delete en C.

L'équivalent le plus proche sont les fonctions malloc et free , si vous ignorez les constructeurs/destructeurs et saisissez safety.

#include <stdlib.h>

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;
44
kennytm

L'utilisation de new et delete en C++ combine deux responsabilités: allouer/libérer de la mémoire dynamique et initialiser/libérer un objet.

Comme le disent toutes les autres réponses, la façon la plus courante d'allouer et de libérer de la mémoire dynamique est d'appeler malloc et free. Vous pouvez également utiliser des fonctions spécifiques au système d'exploitation pour obtenir une grande partie de la mémoire et allouer vos objets à cela, mais cela est plus rare - uniquement si vous avez des exigences assez spécifiques auxquelles malloc ne satisfait pas.

En C, la plupart des API fourniront une paire de fonctions qui remplissent les autres rôles de new et delete.

Par exemple, le fichier api utilise une paire de fonctions d'ouverture et de fermeture:

// C++
fstream* fp = new fstream("c:\\test.txt", "r");
delete fp;

// C
FILE *fp=fopen("c:\\test.txt", "r"); 
fclose(fp);

Il se peut que fopen utilise malloc pour allouer le stockage pour la structure FILE, ou il peut allouer statiquement une table pour le nombre maximal de pointeurs de fichier au démarrage du processus. Le fait est que l'API n'exige pas que le client utilise malloc et free.

D'autres API fournissent des fonctions qui effectuent simplement l'initialisation et la libération d'une partie du contrat - équivalent au constructeur et au destructeur, ce qui permet au code client d'utiliser un stockage automatique, statique ou dynamique. Un exemple est l'API pthreads:

pthread_t thread;

pthread_create( &thread, NULL, thread_function, (void*) param); 

Cela permet au client plus de flexibilité, mais augmente le couplage entre la bibliothèque et le client - le client a besoin de connaître la taille du pthread_t type, alors que si la bibliothèque gère à la fois l'allocation et l'initialisation, le client n'a pas besoin de connaître la taille du type, donc l'implémentation peut varier sans changer du tout le client. Aucun n'introduit autant de couplage entre le client et l'implémentation que le fait C++. (Il est souvent préférable de considérer le C++ comme un langage de métaprogrammation de modèle avec des tables vtables qu'un langage OO)

6
Pete Kirkham

Pas directement une réplique exacte, mais les équivalents compatibles sont malloc et gratuits.

<data-type>* variable = (<data-type> *) malloc(memory-size);
free(variable);

Pas de constructeurs/destructeurs - C de toute façon n'en a pas :)

Pour obtenir la taille de la mémoire, vous pouvez utiliser l'opérateur sizeof.

Si vous souhaitez travailler avec des tableaux multidimensionnels, vous devrez l'utiliser plusieurs fois (comme neuf):

int** ptr_to_ptr = (int **) malloc(12 * sizeof(int *)); //assuming an array with length 12.
ptr[0] = (int *) malloc(10 * sizeof(int));   //1st element is an array of 10 items
ptr[1] = (int *) malloc(5 * sizeof(int));    //2nd element an array of 5 elements etc
3
Gaurav Vaish

Utilisez les fonctions malloc/free.

2
Ashish Jindal