[PDF] Cours Langage C/C++ Mémoire et allocation dynamique





Previous PDF Next PDF



Programmation C++ (débutant)/Notions de base

Chaque programme en C++ doit être écrit en respectant des règles d'écriture très strictes que nous étudierons petit à petit. Un langage compilé. Le C++ est un 



C++ : LES BASES

Apparu au début des années 90 le langage C++ est actuellement l'un des plus Le but de ce cours est de présenter la syntaxe de base du langage C++.



Cours Langage C/C++ Mémoire et allocation dynamique

Les fonctions malloc et free ainsi que les opérateurs du langage. C++ new et delete permettent





Langage C++ et calcul scientifique

16 déc. 2013 Al- ternant algorithmes et applications les programmes sont directement présentés en langage C++. Ils sont sous forme concise et claire



Chapitre 1 : Les entrées sorties en C/C++

Dans ce chapitre nous allons voir les fonctions d'entrée/sortie du langage C++



Guide de codage pour le langage C++

Guide de codage pour le langage C++. Introduction. Ce document qui énumère les recommandations de codage relatives au langage C++ communément admises dans.



Programmation C++ (débutant)/Les classes

Une classe va permettre de regrouper en une seule entité des données membres et des fonctions membres appelées méthodes. Cependant contrairement au langage C



Cours Langage C++ : Héritage et polymorphisme Programmation

Cours Langage C++ : Héritage et polymorphisme. Programmation Orienté Objet. Thierry Vaira. BTS IRIS Avignon tvaira@free.fr.



Programmation C++ (débutant)/Les fonctions

La réutilisation de code est une des notions fondamentales du langage C++. La notion de fonction est une des premières méthodes nous permettant d'aborder le 

Cours Langage C/C++

Mémoire et allocation dynamique

Thierry Vaira

BTS IRIS Avignon

tvaira@free.fr?v0.1

La mémoire

La pile et le tas

La mémoire dans un ordinateur est unesuccession d"octets (soit 8 bits), organisés les uns à la suite des autres etdirectement accessibles par une adresse.En C/C++, la mémoire pour stocker des variables est organisée en

deux catégories :1la pile (stack)2le 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. tv (BTS IRIS Avignon)Cours C/C++tvaira@free.fr?v0.1 2 / 13

La mémoire

La pile (stack)

La pile (stack) est unespace mémoire réservé au stockage des

variables désallouées automatiquement.Sa taille est limitée mais on peut la régler (appel POSIXsetrlimit).La pile est bâtie sur le modèleLIFO(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. tv (BTS IRIS Avignon)Cours C/C++tvaira@free.fr?v0.1 3 / 13

La mémoire

Le tas (heap)

Le tas (heap) est l"autresegment de mémoire utilisé lors de l"allocation dynamiquede mémoire durant l"exécution d"un

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

limitée.Les fonctionsmallocetfree, ainsi que les opérateurs du langage C++newetdeletepermettent, 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.

tv (BTS IRIS Avignon)Cours C/C++tvaira@free.fr?v0.1 4 / 13

La mémoire

Sous Linux, on peut visualiser facilement les valeurs du tas et de la pile : $ ulimit -a data seg size (kbytes, -d) unlimited stack size (kbytes, -s) 8192 ...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! tv (BTS IRIS Avignon)Cours C/C++tvaira@free.fr?v0.1 5 / 13

Allocation dynamique

malloc et free L"allocation d"une nouvelle zone mémoire se fait dans un endroit

particulier de la mémoire appelée letas(heap).Elle se fait par la fonctionmalloc:void *malloc(size_t

taille);L"argument transmis correspond à latailleen o ctetsde la zone mémoire désirée.La valeur retournée est unpointeurvoid * sur la zone mémoire

allouée, ouNULLen cas d"échec de l"allocation.Si vous devez redimensionner un espace mémoire qui a été alloué

dynamiquement, il faudra utiliser la fonctionrealloc().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édurefree:void free(void *pointeur); tv (BTS IRIS Avignon)Cours C/C++tvaira@free.fr?v0.1 6 / 13

Allocation dynamique

Exemple : allocation mémoire

int*p;//pointeur sur un entier int*T;//pointeur sur un entier allocation dynamique d un entier p = (int*)malloc(sizeof(int));//alloue 4 octets (= int )en mémoire *p = 1;//ecrit 1 dans la zone mémoire allouée allocation dynamique d un tableau de 10 int T = (int*)malloc(sizeof(int) * 10);//alloue 4 * 10 octets en mémoire initialise le tableau avec des 0 cf la fonction memset for(inti=0;i<10;i++) { *(T+i) = 0;//les 2 écritures sont possibles T[i] = 0;//identique à la ligne précèdente ou plus directement memset(T, 0,sizeof(int)*10);//il faudra alors inclure string .h free(p);

free(T);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. tv (BTS IRIS Avignon)Cours C/C++tvaira@free.fr?v0.1 7 / 13

Allocation dynamique

Règles de bonne conduite

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 à

NULLAvant tout appel demalloc(), on doit s"assurer que le pointeur à allouer est bienNULLAprès tout appel demalloc(), on s"assure qu"aucune erreur ne s"est produiteAvant de libérer une zone mémoire, on s"assure que son pointeur n"est pasNULLDès qu"une zone mémoire vient d"être libérée parfree(), on réinitialise son pointeur àNULLtv (BTS IRIS Avignon)Cours C/C++tvaira@free.fr?v0.1 8 / 13

Allocation dynamique

new et delete

Pour allouer dynamiquement en C++, on utilisera l"opérateurnew.Celui-ci renvoyant une adresse où est crée la variable en question, il

nous faudra un pointeur pour la conserver.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érateurdelete.tv (BTS IRIS Avignon)Cours C/C++tvaira@free.fr?v0.1 9 / 13

Allocation dynamique

Pour allouer dynamiquement en C++, on utilisera l"opérateurnew.Exemple : allocation dynamique include iostream include iostream include new using namespacestd; intmain () int* p1 =newint ;//pointeur sur un entier *p1 = 1;//ecrit 1 dans la zone mémoire allouée cout << *p1 << endl;//lit et affiche le contenu de la zone mémoire allouée deletep1;//libère la zone mémoire allouée return0; tv (BTS IRIS Avignon)Cours C/C++tvaira@free.fr?v0.1 10 / 13

Allocation dynamique

Exemple : allocation dynamique d"un tableau

include iostream include new using namespacestd; intmain () int* p2 =newint [5];//alloue un tableau de 5 entiers en mémoire initialise le tableau avec des 0 cf la fonction memset for(inti=0;i<5;i++) *(p2 + i) = 0;//les 2 écritures sont possibles p2[i] = 0;//identique à la ligne précèdente cout << "p2[" << i << "] = " << p2[i] << endl; delete[] p2;//libère la mémoire allouée return0; tv (BTS IRIS Avignon)Cours C/C++tvaira@free.fr?v0.1 11 / 13

Allocation dynamique

Pour allouer dynamiquement unobjet, on utilisera l"opérateurnew.Exemple : allocation dynamique d"un objet

include iostream include point h using namespacestd; intmain() Point *pointC;//je suis pointeur sur un objet de type Point pointC =newPoint(2,2);//j "allouedynamiquement un objet de type Point

pointC->afficher();//Comme pointC est une adresse ,je dois utiliser l "opérateur-> pour accéder aux

membres de cet objet pointC->setY(0);//je modifie la valeur de l "attribut_y de pointB

(*pointC).afficher();//cette écriture est possible : je pointe l "objetpuis j "appellesa méthode

afficher deletepointC;//ne pas oublier de libérer la mémoire allouée pour cet objet return0; }tv (BTS IRIS Avignon)Cours C/C++tvaira@free.fr?v0.1 12 / 13

Allocation dynamique

Fuite de mémoire

L"allocation dynamique dans le tasne 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 unefuite 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).tv (BTS IRIS Avignon)Cours C/C++tvaira@free.fr?v0.1 13 / 13quotesdbs_dbs46.pdfusesText_46
[PDF] langage calculatrice ti-83 plus

[PDF] langage de programmation pdf

[PDF] langage de texto

[PDF] Langage des fonctions, algébrique et lié au graphique

[PDF] langage et mathématiques

[PDF] langage javascript cours

[PDF] langage javascript debutant

[PDF] langage mathématique de base

[PDF] langage naturel maths

[PDF] langage pascal exercices corrigés pdf

[PDF] langage pascal informatique

[PDF] langage pascal pour debutant

[PDF] langage pascal pour debutant pdf

[PDF] langage pascal site du zero

[PDF] langage poétique définition