Allocation dynamique de mémoire en C++

Allocation Dynamique De Memoire En C



Normalement, lors de l'utilisation de codes sources dans le langage de programmation C++, un compilateur alloue manuellement la mémoire à la variable pour le stockage des données. On dit qu'il s'agit d'une allocation de mémoire statique. Il s'agit d'une mémoire fixe qui ne peut pas être modifiée une fois déclarée. Pour ce type d'allocation de mémoire, le système d'exploitation utilise la pile pour stocker les données. Dans l'allocation statique, la mémoire est allouée avant que le code source ne commence à s'exécuter.

Alors que, dans l'allocation de mémoire dynamique, la mémoire est allouée alors que l'exécution a commencé. Cette mémoire est allouée manuellement par le programmeur au moment de l'exécution, également appelée allocation de mémoire d'exécution en C++. La taille de la mémoire dynamique peut être modifiée à n'importe quel endroit du programme car au moment de la déclaration, on ne mentionne pas de taille qui puisse être fixée. Nous fournissons uniquement la valeur directement à la variable.

Différence d'allocation de mémoire aux variables normales

Dans les variables normales, la mémoire allouée par un compilateur est allouée et désallouée automatiquement. Lorsque la mémoire est allouée dynamiquement par le programmeur, il doit alors supprimer ou désallouer la mémoire lorsqu'elle ne sert plus à l'exécution ultérieure du code source. Cette situation provoque une « fuite de mémoire » lorsque le programme est terminé alors que la mémoire n'est pas libérée.







Opérateurs d'allocation dynamique

En C++, deux opérateurs aident à l'allocation et à la désallocation de la mémoire : 'nouveau' et 'supprimer' qui sont utilisés pour l'allocation et la désallocation de la mémoire d'une meilleure manière.



Nouvel opérateur

Cela signifie la demande d'allocation de mémoire. Le nouvel opérateur initialise la mémoire et renvoie l'adresse de cette mémoire allouée à la variable de pointeur s'il y a suffisamment de mémoire disponible.



Objet pointeur = Nouveau Les données - taper ;

Supprimer l'opérateur

Tout comme l'opérateur new, un opérateur delete est utilisé pour supprimer la mémoire allouée. En C++, le programmeur peut utiliser cet opérateur pour la désallocation.





# Supprimer la variable_pointeur ;

Exemple 1

Dans cet exemple, nous allons introduire deux pointeurs : l'un est un pointeur de type entier et l'autre est un pointeur flottant. Les pointeurs sont initialisés en utilisant un astérisque avec eux.

# Entier * pointEntier ;
# Float *pointfloat;

En utilisant ces deux imprimantes, nous allouerons dynamiquement la mémoire.



Rôle des pointeurs dans l'allocation dynamique :
La mémoire de l'espace de stockage est développée sous forme de blocs. Chaque fois que nous exécutons un programme ou effectuons une opération, la mémoire est allouée à cette fin spécifique. Cette mémoire a une adresse spéciale qui est associée au programme qui identifie quel processus ou programme est autorisé à cette mémoire. Tout emplacement de mémoire est accessible via l'adresse à laquelle il appartient. Cette adresse est donc stockée via les pointeurs. En bref, nous avons besoin de pointeurs pour accéder à la mémoire et de la même manière, pour allouer une partie spécifique de la mémoire à n'importe quelle tâche. Les pointeurs sont nécessaires pour stocker les adresses.

Comme le mot-clé « new » est utilisé pour l'allocation dynamique de la mémoire dans l'allocation manuelle, la mémoire est allouée par le compilateur. Nous n'avons pas besoin d'allouer de la mémoire au moment de l'exécution. Mais comme l'allocation dynamique est aléatoire, nous devons identifier les pointeurs et pour le processus de liaison, ce nouvel opérateur est utilisé.

# Pointint = nouveau entier ;

De même, le pointeur flottant est lié de la même manière. Après le processus de liaison, nous attribuerons n'importe quelle valeur à la mémoire que nous voulons réserver pour n'importe quelle opération. En déclarant le pointeur, nous attribuons une valeur spécifique à la mémoire.

# *pointEntier = 50 ;

Une valeur flottante pour les points flottants est également déclarée. Affichez les valeurs après l'affectation.

Comme nous l'avons vu, l'opérateur 'nouveau' est utilisé pour allouer tandis que 'supprimer' est utilisé pour libérer de la mémoire. Ainsi, une fois que vous avez terminé la tâche ou l'opération dans le code, nous supprimerons la mémoire que nous avons allouée à la tâche.

Il est préférable de désallouer cette partie de la mémoire afin que tout autre processus puisse en profiter. Nous appliquerons cette allocation aux deux pointeurs.

Supprimer le point flotteur ;

Une fois que vous avez enregistré le code sur l'éditeur de texte, le terminal Ubuntu vous permet d'exécuter le code source à l'intérieur du fichier via un compilateur g++.

$ g++ -o mem mem.c
$ ./mem

Lors de l'exécution, vous verrez les valeurs affectées à la mémoire.

Exemple 2

Cet exemple a l'implication de l'interaction de l'utilisateur. Nous prendrons une variable numérique qui contiendra une valeur de l'utilisateur. Ce programme stockera le résultat dans le GPA des étudiants. Tous les résultats seront enregistrés au moment de l'exécution.

Lorsque l'utilisateur entre le nombre d'étudiants, la mémoire est allouée à chaque nombre. Un pointeur de type flottant est initialisé ici qui sera utilisé dans l'allocation mémoire des résultats.

Nous prenons le pointeur en flottant puisque GPA est en notation décimale. Nous prenons un tableau de type pointeur pour le GPA car il peut en résulter pour un certain nombre d'étudiants.

Ptr = Nouveau flotteur [ sur une ]

Ce tableau de pointeurs avec le mot clé 'new' liera l'exécution à la mémoire. Le GPA sera saisi pour chaque étudiant. Comme nous ne connaissons pas le nombre d'étudiants que l'utilisateur souhaite ajouter, nous avons utilisé une boucle for pour saisir le GPA jusqu'au nombre saisi. A chaque répétition de la boucle, l'utilisateur est invité à saisir le résultat identifiant l'élève. Une fois le résultat enregistré, nous utiliserons à nouveau une boucle pour afficher tous les GPA des étudiants. En fin de compte, le tableau de type pointeur est supprimé, car l'objectif du stockage dynamique a été atteint.

Effacer [ ] ptr ;

Nous allons maintenant exécuter le code mentionné ci-dessus. L'utilisateur sera d'abord invité à entrer le nombre d'élèves. Ensuite, le GPA pour chaque étudiant sera entré.

Exemple 3

Cet exemple utilise les opérateurs new et delete pour l'objet de la classe. Cette classe contient une variable privée de type entier qui stocke l'âge. Dans la partie publique d'une classe, le constructeur est créé qui initialisera l'âge à un nombre '10'. Une autre fonction est utilisée ici qui affichera l'âge qui est initialisé dans le constructeur.

Passons maintenant au programme principal de l'allocation dynamique. L'objet de la classe est créé dynamiquement.

Étudiant * ptr = Nouveau étudiant ( ) ;

Lorsque l'objet est formé, le constructeur sera implémenté automatiquement. Un appel de fonction sera effectué pour obtenir l'âge. Cela se fera par le biais du ptr.

Ptr - > obtenirÂge ( ) ;

Et à la fin, la mémoire sera libérée.

Conclusion

L'allocation de mémoire dynamique est allouée au moment de l'exécution par le programmeur au lieu du stockage fixe identifié par le compilateur. Cette allocation est aléatoire et peut être éliminée après utilisation. Alors que dans la plupart des cas, avant la suppression, le processus d'exécution s'arrête et cette allocation dynamique provoque alors les fuites mémoire. Nous avons implémenté ce phénomène dans différentes approches du système Ubuntu Linux en utilisant le langage de programmation C++.