Cours gratuits » Cours informatique » Cours programmation » Cours langage C » Cours Langage C Mémoire et allocation dynamique pdf

Cours Langage C Mémoire et allocation dynamique pdf


Télécharger



★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

 

BTS IRIS Avignon

« v0.1

 

 La mémoire dans un ordinateur est une succession d’octets (soit 8 bits), organisés les uns à la suite des autres et directement accessibles par une adresse.

La mémoire

 
 

La pile et le tas

 En C/C++, la mémoire pour stocker des variables est organisée en deux catégories :

1        la pile (stack)

2        le tas (heap)

 Remarque : Dans la plupart des langages de programmation compilés, la pile (stack) est l’endroit où sont stockés

les paramètres d’appel et les variables locales des fonctions.

 La pile (stack) est un espace mémoire réservé au stockage des variables désallouées automatiquement.

 Sa taille est limitée mais on peut la régler (appel POSIX setrlimit).

La mémoire

 
 

La pile (stack)

 La pile est bâtie sur le modèle LIFO (Last In First Out) ce qui signifie "Dernier Entré Premier Sorti". Il faut voir cet espace mémoire comme une pile d’assiettes où on a le droit d’empiler/dépiler qu’une seule assiette à la fois. Par contre on a le droit d’empiler des assiettes de taille différente. Lorsque l’on ajoute des assiettes on les empile par le haut, les unes au dessus des autres. Quand on les "dépile" on le fait en commençant aussi par le haut, soit par la dernière posée.

Lorsqu’une valeur est dépilée elle est effacée de la mémoire.

 Le tas (heap) est l’autre segment de mémoire utilisé lors de l’allocation dynamique de mémoire durant l’exécution d’un programme informatique.

La mémoire

 
 

Le tas (heap)

 Sa taille est souvent considére comme illimitée mais elle est en réalité limitée.

 Les fonctions malloc et free, ainsi que les opérateurs du langage C++ new et delete permettent, respectivement, d’allouer et désallouer la mémoire sur le tas.

 La mémoire allouée dans le tas doit être désallouée explicitement.

 

La mémoire

 

La taille de la pile étant limitée (ici à 8Mo), cela peut provoquer des écrasements de variables et surtout des "Erreur de segmentation" en cas de dépassement. Il est évidemment recommandé d’allouer dans le tas les "grosses" variables sous peine de surprise!

 L’allocation d’une nouvelle zone mémoire se fait dans un endroit particulier de la mémoire appelée le tas (heap).

 Elle se fait par la fonction malloc : void *malloc(size_t taille);

 L’argument transmis correspond à la taille en octets de la zone mémoire désirée.

Allocation dynamique

 
 

malloc et free

 La valeur retournée est un pointeur void * sur la zone mémoire allouée, ou NULL en cas d’échec de l’allocation.

 Si vous devez redimensionner un espace mémoire qui a été alloué dynamiquement, il faudra utiliser la fonction realloc().

 La mémoire allouée doit, à un moment ou un autre, être libérée. Cette libération mémoire se fait par la procédure free : void free(void *pointeur);

 

Allocation dynamique

 

Une fois qu’une zone mémoire a été libérée, il ne faut sous aucun prétexte y accéder, de même qu’il ne faut pas tenter de la libérer une seconde fois.

Un certain nombre de règles, quand elles sont observées, permettent de se mettre à l’abri de problèmes :

 Toute déclaration de pointeur s’accompagne de son initialisation à

NULL

Allocation dynamique

 
 

Règles de bonne conduite

 Avant tout appel de malloc(), on doit s’assurer que le pointeur à allouer est bien NULL

 Après tout appel de malloc(), on s’assure qu’aucune erreur ne s’est produite

 Avant de libérer une zone mémoire, on s’assure que son pointeur n’est pas NULL

 Dès qu’une zone mémoire vient d’être libérée par free(), on réinitialise son pointeur à NULL

Pour allouer dynamiquement en C++, on utilisera l’opérateur new.

Celui-ci renvoyant une adresse où est crée la variable en question, il nous faudra un pointeur pour la conserver.

Allocation dynamique

 
 

new et delete

 Manipuler ce pointeur, reviendra à manipuler la variable allouée dynamiquement.

 Pour libérer de la mémoire allouée dynamiquement en C++, on utilisera l’opérateur delete.


Pour allouer dynamiquement en C++, on utilisera l’opérateur new.

   

Pour allouer dynamiquement un objet, on utilisera l’opérateur new.

 

L’allocation dynamique dans le tas ne permet pas la désallocation automatique.

Chaque allocation avec "new" doit impérativement être libérée (détruite) avec "delete" sous peine de créer une fuite de mémoire.

Allocation dynamique

 
 

Fuite de mémoire

La fuite de mémoire est une zone mémoire qui a été allouée dans le tas par un programme qui a omis de la désallouer avant de se terminer. Cela rend la zone inaccessible à toute application (y compris le système d’exploitation) jusqu’au redémarrage du système. Si ce phénomène se produit trop fréquemment la mémoire se remplit de fuites et le système finit par tomber faute de mémoire.

Ce problème est évité en Java en introduisant le mécanisme de "ramasse-miettes" (Garbage Collector).


80