Fuite mémoire de la classe string
Bonjour,
j'ai une fuite mémoire (960bytes) dans le programme suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11
| #include <stdlib.h>
#include <string>
using namespace std;
int
main(int argc, char *argv[]) {
string s("hello world");
cout << s << endl;
return EXIT_SUCCESS;
} |
Cela viendrait de la déclaration du string. Je ne comprends pas pourquoi. Si quelqu'un avait une explication je lui en serais très reconnaissant.
Merci de votre aide,
cordialement,
Jean
[Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]
Re: Fuite mémoire de la classe string
Citation:
Envoyé par jean_barac
j'ai une fuite mémoire (960bytes) dans le programme suivant
tu es vraiment certain d'avoir une fuite mémoire ?, ce n'est pas parce que la gestion des string a pris de la mémoire qu'elle est vraiment perdue, dés la prochaine allocation d'une string elle sera re-utilisée. On voit bien que 960 octets n'a aucun rapport avec ton "hello world", string c'est pris un buffer de travail.
Re: Fuite mémoire de la classe string
Citation:
Envoyé par bruno_pages
Citation:
Envoyé par jean_barac
j'ai une fuite mémoire (960bytes) dans le programme suivant
tu es
vraiment certain d'avoir une fuite mémoire ?, ce n'est pas parce que la gestion des
string a pris de la mémoire qu'elle est vraiment perdue, dés la prochaine allocation d'une
string elle sera re-utilisée. On voit bien que 960 octets n'a aucun rapport avec ton "hello world",
string c'est pris un buffer de travail.
C'est bien ce qui est expliqué dans le lien donné par Loïc.
Re: Fuite mémoire de la classe string
Citation:
Envoyé par Loulou24
C'est bien ce qui est expliqué dans le lien donné par Loïc.
:oops: désolé, j'y étais allé voir, mais il y avait trop de choses à lire, et moi qui 'râle' parce que les gens ne lisent pas la doc de bouml ...
Re: Fuite mémoire de la classe string
J'utilise pas mal les conteneurs de la STL et j'avais le même genre de problème lorsque je détectais les fuites de mémoire.
En fait l'explication est simple. "main" est une fonction comme les autres (enfin presque). Dans cette fonction tu déclares une classe string. Bah en fait ta classe string et les allocations mémoires qu'elle a faites ne seront libérées uniquement lorsque tu sortiras de la fonction "main". C'est le comportement normal (empilage-dépilage -> appel du destructeur).
Je suis à peu près sur que ton outil de détection de fuite ne fonctionne qu'à l'intérieur du "main". Donc tout ce qui se passe au niveau de l'accolade fermante du "main", et bien il ne le sait pas. Et c'est bien dommage parce que c'est là que les pseudo-fuites que tu as détectées sont libérées.
un moyen de t'en convaincre, libéres toi-même les allocations de la string avant la fin du "main" et lances ton détecteur de fuite à ce moment-là:
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdlib.h>
#include <string>
using namespace std;
int
main(int argc, char *argv[]) {
string s("hello world");
cout << s << endl;
s.clear();
return EXIT_SUCCESS;
} |
Tu verras que la STL n'est pas buggée. Pas sur un code aussi simple quand-même.
Re: Fuite mémoire de la classe string
Citation:
Envoyé par moldavi
Tu verras que la STL n'est pas buggée. Pas sur un code aussi simple quand-même.
On ne peut malheureusement pas dire ça de toute les STL... Suivez mon regard... Troll mis à part, il peut réellement avoir des bugs dans certaines implémentation de la STL, même dans des codes aussi simples. Ce n'est bien sûr pas par là qu'il faut commencer à chercher la causes des disfonctionnement, mais il ne faut pas non plus tomber dans l'excès inverse : toute les STL ne sont pas infaillibles.