[C] Allocation dynamique

  • Partenaires

Utilisateurs qui regardent le poste (Total: 0, Members: 0, Invité: 0)

Statut
La discussion n'est pas ouverte à d'autres réponses
fsadki

fsadki

Membre d'Honneur
Level 5
Level 4
Level 3
Level 2
Level 1
1 Juin 2010
8,166
1
944
31
Euh... Chez moi
Salut,



Pour la petite information, je suis actuellement en DUT informatique.
Nous avons vue le langage C dans toute sa splendeur ( pointeurs, structures, tableau, différents tris etc...).
En revanche une petite question reste dans ma tête et étant impatient ( car mon prochain cours de Programmation sera le Vendredi), je la poste ici.

Cela concerne la fonction malloc et free.
Autant être le plus explicite possible, je sais que la fonction malloc permet d'allouer un espace mémoire, et que à l'inverse la fonction free la libère.
J'ai appris ses définitions sans réellement les comprendre, du moins je ne saurais les utiliser.. ( honte a moi :non: ).

Donc, disons plutôt que mon problème est que je ne vois pas à quoi ça sert. Admettons que je crée un répertoire téléphonique, si j'alloue une mémoire pour l'inscription, puis que je ferme le programme. Une fois relancé, si j'affiche mon répertoire, sera t-il vide ou non ?
(Je tiens a préciser que le programme se lance sur une console).




Merci d'avance ;

Cordialement,

Fsadki.
 
Evaelis

Evaelis

La Voix de la Sagesse
Level 5
Level 4
Level 3
Level 2
Ancien staff
Level 1
28 Avr. 2010
22,929
465
1,699
Valhalla
Si je ne me trompe pas, une fois ton programme fermé, toutes les instances de mémoire ouverte seront fermées et écrasées.
 
fsadki

fsadki

Membre d'Honneur
Level 5
Level 4
Level 3
Level 2
Level 1
1 Juin 2010
8,166
1
944
31
Euh... Chez moi
Oui tout à fait.
De toute façon si je relance le programme avec le même code, j'ai essayer et ça écrase / ou ça supprime.
Donc quel est l'intérêt de la fonction malloc ?
 
davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 2013
508
0
322
'merica
C'est pour pouvoir utiliser la mémoire de l'OS. (Heap)

malloc te 'donne' (alloue) un espace mémoire, free le libère pour que l'OS le passe a d'autres applications.
 
Evaelis

Evaelis

La Voix de la Sagesse
Level 5
Level 4
Level 3
Level 2
Ancien staff
Level 1
28 Avr. 2010
22,929
465
1,699
Valhalla
Si j'ai bien compris, ça permet de ne pas garder un espace de mémoire (vide) occupé alors qu'une autre application en aurait besoin.
Optimiser les performances ?
 
davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 2013
508
0
322
'merica
Si tu oublies d'utiliser 'free'/'delete' la heap va se remplir progressivement, jusqu'au moment ou il n'y a définitivement plus de place en mémoire, ce qui fera crash le programme.

Par contre je ne suis pas sur que la mémoire heap ai un effet sur les performances de l'OS. (mais logiquement oui)
 
fsadki

fsadki

Membre d'Honneur
Level 5
Level 4
Level 3
Level 2
Level 1
1 Juin 2010
8,166
1
944
31
Euh... Chez moi
Cela explique pas mal de chose x)
En revanche y a t-il une réelle utilité a utiliser lorsque l'on lance un programme sous console ?
Ou alors, n'est-ce que pour pouvoir libérer un espace alloué et donc rendre le programme plus rapide ? Donc c'est de l'optimisation ?

Autre chose, admettons que j'alloue une case d'un tableau, si j'ajoute du contenu et que je fais un free dessus, la case sera donc vide si je comprend bien ?

Merci d'avance :)
 
Evaelis

Evaelis

La Voix de la Sagesse
Level 5
Level 4
Level 3
Level 2
Ancien staff
Level 1
28 Avr. 2010
22,929
465
1,699
Valhalla
Si j'ai bien compris, pas vide mais inexistante ?
 
fsadki

fsadki

Membre d'Honneur
Level 5
Level 4
Level 3
Level 2
Level 1
1 Juin 2010
8,166
1
944
31
Euh... Chez moi
Si j'ai bien compris, pas vide mais inexistante ?

Dans le sens ou je dis vide, c'est qu'il n'y a plus de right-value.
Par exemple si j'avais alloué une case d'un tableau à l'indice i, en mettant dedans ma date de naissance si je fais un free dessus, le contenu ne seras plus la. Ou alors c'est la case qui disparait, mais du coup qu'arrive-t-il au reste du tableau ?
 
davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 2013
508
0
322
'merica
Je pense pas que ce soit possible d'allouer seulement une case d'un tableau (en tout cas c'est pas possible en c++). Par contre si tu alloue le tableau en entier, tu doit le 'supprimer' en entier aussi.
 
fsadki

fsadki

Membre d'Honneur
Level 5
Level 4
Level 3
Level 2
Level 1
1 Juin 2010
8,166
1
944
31
Euh... Chez moi
Je pense pas que ce soit possible d'allouer seulement une case d'un tableau (en tout cas c'est pas possible en c++). Par contre si tu alloue le tableau en entier, tu doit le 'supprimer' en entier aussi.

Merci de ta réponse.
Ça résout donc le problème que je me posais sur les cases d'un tableau.
Donc l'allocation peut servir sur un très long code, mais inutile sur un petit programme.
Je vérifierai avec différents TD.
 
davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 2013
508
0
322
'merica
L'allocation dynamique peut aussi servir sur de petits programmes. Je te conseille de lire cette page :


En parlant de tableaux, ils fonctionnent justement grâce au pointeurs.
Petite explication en C++ :
Code:
int datarray[] = { 1, 2, 3, 4 };

	int* arrayBase = &datarray[0];

	cout << &datarray[0] << " : " << arrayBase << " : " << *arrayBase << endl;
	cout << &datarray[1] << " : " << (arrayBase + 0x1) << " : " << *(arrayBase + 0x1) << endl;
	cout << &datarray[2] << " : " << (arrayBase + 0x2) << " : " << *(arrayBase + 0x2) << endl;
	cout << &datarray[3] << " : " << (arrayBase + 0x3) << " : " << *(arrayBase + 0x3) << endl;

En gros, pour le compilateur, ' array[n] ' est égal a ' *(&array[0] +n) '.

PS : C'est la même chose pour les char[] et les strings.
 
fsadki

fsadki

Membre d'Honneur
Level 5
Level 4
Level 3
Level 2
Level 1
1 Juin 2010
8,166
1
944
31
Euh... Chez moi
Oui mais dans l'exemple donne, on demande l'âge de l'utilisateur.
Mais que l'on fasse une allocation ou non, ça ne change pas grand chose, vue qu'à la fermeture du programme, l'espace est à nouveau libérer ( dans le cas ou on alloc pas).
Alors que si on utilise les fonctions malloc et free, ça revient à tout faire manuellement.
 
davydavekk

davydavekk

Level 5
Level 4
Level 3
Level 2
Level 1
23 Mai 2013
508
0
322
'merica
Ça dépend de ce que tu va faire avec l'age, si c'est juste pour le demander puis l'afficher dans la console, oui c'est inutile.
 
fsadki

fsadki

Membre d'Honneur
Level 5
Level 4
Level 3
Level 2
Level 1
1 Juin 2010
8,166
1
944
31
Euh... Chez moi
Ça dépend de ce que tu va faire avec l'age, si c'est juste pour le demander puis l'afficher dans la console, oui c'est inutile.

Merci de ta réponse.
En cours, on ne fait que ça, on ne fait que la demander, puis on l'affiche a la fin et le programme est finit.
 
drov

drov

Level 5
Level 4
Level 3
Level 2
Level 1
27 Fév. 2012
1,427
1
944
En console c'est useless, ça sert principalement à gérer la mémoire et éviter les fuites de mémoire. ( pour éviter des programmes genre firefox qui bouffent 700 mo au bout d'une heure ^^)
 
Statut
La discussion n'est pas ouverte à d'autres réponses