Article de reference

Allocation dynamique de mémoire en C

L'allocation dynamique de mémoire en C fait référence à la gestion manuelle de la mémoire pour l'allocation dynamique de mémoire dans le langage de programmation C via un groupe...

la gestion manuelle de la mémoire pour l'allocation dynamique de mémoire dans le langage de programmation C via un groupe de fonctions de la bibliothèque standard C , principalement C++ inclut ces fonctions ; cependant, les opérateurs `new` et `delete` offrent des fonctionnalités similaires et sont recommandés par les auteurs de ce langage. Néanmoins, dans certaines situations, l’utilisation de `/` n’est pas appropriée, notamment pour le code de gestion de la mémoire ou le code sensible aux performances, et une combinaison de ` new` et `delete` peut s’avérer nécessaire à la place de l’opérateur de plus haut niveau .langage C gère la mémoire de manière statique , automatique ou dynamique . Les variables statiques sont allouées en mémoire principale, généralement avec le code exécutable du programme, et y restent pendant toute la durée de vie de celui-ci. Les variables automatiques sont allouées sur la pile et leur taille est modifiée lors des appels et retours de fonctions. Pour les variables statiques et automatiques, la taille de l'allocation doit être constante à la compilation (sauf dans le cas des tableaux automatiques de longueur variable ). Si la taille requise n'est connue qu'à l'exécution (par exemple, si des données de taille arbitraire sont lues depuis l'utilisateur ou un fichier disque), l'utilisation d'objets de données de taille fixe est inadéquate.

La durée de vie de la mémoire allouée peut également poser problème. Ni la mémoire à durée statique ni la mémoire à durée automatique ne conviennent à toutes les situations. Les données allouées automatiquement ne sont pas conservées entre plusieurs appels de fonction, tandis que les données statiques persistent pendant toute la durée d'exécution du programme, qu'elles soient nécessaires ou non. Dans de nombreux cas, le programmeur a besoin d'une plus grande flexibilité dans la gestion de la durée de vie de la mémoire allouée.

Ces limitations sont contournées grâce à l'allocation dynamique de mémoire , qui gère la mémoire de manière plus explicite (mais aussi plus flexible), généralement en l'allouant à partir du tas (espace mémoire libre), une zone de mémoire structurée à cet effet. En C, la fonction de bibliothèque `allocate` mallocpermet d'allouer un bloc de mémoire sur le tas. Le programme accède à ce bloc via un pointeur qui mallocrenvoie `null`. Lorsque la mémoire n'est plus nécessaire, le pointeur est passé à ` freedislocate`, qui libère la mémoire afin qu'elle puisse être utilisée à d'autres fins.

La description originale du langage C indiquait que `std::storage` callocet cfree`std::storage` étaient présents dans la bibliothèque standard, mais pas ` std malloc::storage`. Un exemple de code pour une implémentation simple d'un gestionnaire de stockage sous Unix était fourni , utilisant `std::storage` allocet free`std::storage` comme fonctions d'interface utilisateur, et l' sbrkappel système `std::storage` pour demander de la mémoire au système d'exploitation. La documentation Unix de la 6e édition mentionne `std::storage` allocet ` std::storage` freecomme fonctions d'allocation de mémoire de bas niveau. Les routines malloc` freestd::storage` et `std::storage`, dans leur forme moderne, sont décrites en détail dans le manuel Unix de la 7e édition.

Certaines plateformes proposent des appels de fonctions de bibliothèque ou intrinsèques permettant une allocation dynamique à l'exécution à partir de la pile C plutôt que du tas (par exemple alloca() ). Cette mémoire est automatiquement libérée à la fin de l'exécution de la fonction appelante.

Aperçu des fonctions

Les fonctions d'allocation dynamique de mémoire C sont définies dans <stdlib.h>l'en-tête ( <cstdlib>en-tête en C++).

FonctionDescription
tableau de dix entiers avec une portée automatique est simple en C :

tableau de longueur variable (ce qui n'est pas garanti dans toutes les implémentations C11) , on peut allouer un tableau à l'aide de `allocate()` malloc, qui renvoie un pointeur de type `void` (indiquant qu'il s'agit d'un pointeur vers une zone de données de type inconnu), lequel peut être converti par sécurité .

pointeur nommé a(en raison de la syntaxe C, les pointeurs et les tableaux peuvent être utilisés de manière interchangeable dans certaines situations).

Comme mallocil se peut qu'elle ne puisse pas traiter la requête, elle peut renvoyer un pointeur nul ; il est donc recommandé, en programmation, de vérifier ce cas :

" ); return -1 ; }

Lorsque le programme n'a plus besoin du tableau dynamique , il doit finalement appeler freela fonction pour libérer la mémoire qu'il occupe :

initialisée et peut contenir des données résiduelles : des restes de données précédemment utilisées et supprimées. Après une allocation avec malloc, les éléments du tableau sont des variables non initialisées . La commande callocrenverra une allocation déjà effacée.