IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème de libération mémoire


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut Problème de libération mémoire
    Salut!

    Je desire liberer la mémoire occupée par un vecteur mais je suis pas sur de le faire correctement alors j'aurai besoin d'une petite confirmation!

    voici le type de code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    vector<unsigned char> v;
     
    // je mets des trucs dans le vecteur
    v.push_back("A4");
    v.push_back("56");
    v.push_back("73");
    v.push_back("B5");
     
    // est ce que ceci libère la mémoire?????
    v.pop_back();
     
    // est ce que ceci libère la mémoire?????
    v.clear();
    Sinon, comment liberer la mémoire???
    existe t'il un moyen de voir l'occupation de la mémoire??? (j'utilise l'IDE Visual C++ express).

    Merci

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    A partir du moment ou tu ne fait pas de new, pas besoin de delete donc de ce coté pas de souci.

    Ensuite pour liberer la memoire utiliser par ton vecteur :

    pop_back() supprime le dernier element du vecteur, donc oui tu libere l'espace d'un objet.

    clear(), supprime tous les objet du vecteur, du coup ton vecteur est vide et donc encore une fois, il y a liberation de la memoire.

    Pour voir la memoire utilisé tu fait un sizeof de ton type d'objet stocké * size de ton vecteur, puisque tu stockes des objets et non des pointeurs ca marche.

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // je mets des trucs dans le vecteur
    v.push_back("A4");
    v.push_back("56");
    v.push_back("73");
    v.push_back("B5");
    Tu voulais sûrement écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // je mets des trucs dans le vecteur
    v.push_back(0xA4);
    v.push_back(0x56);
    v.push_back(0x73);
    v.push_back(0xB5);
    // est ce que ceci libère la mémoire?????
    v.pop_back();
    Non, cela retire le dernier élément.

    // est ce que ceci libère la mémoire?????
    v.clear();
    Non, cela retire tous les éléments.

    La mémoire est gérée de manière optimisée (par exemple elle reste allouée lorsque tu retires des éléments, de façon à ce que les insertions suivantes soient plus rapides), globalement tu n'as pas à t'en précoccuper.

    existe t'il un moyen de voir l'occupation de la mémoire???
    Avec le gestionnaire de processus par exemple ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut
    Cool merci! c'est ce que je pensais !
    ca me rassure car sinon je voyais vraiment pas comment faire!

    Pour la visualisation de la mémoire, j'imaginais un outil dans l'IDE qui permettent de voir la remplissage(utilisation) de la mémoire. Je sais pas si ca existe?? du genre en faisant tourner le deugger?? Mais ce serait pratique en tout les cas!

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    Tout depend mais quand tu fais un clear ca libere, sauf si tu as fait un reserve.

    Pour le pop au bout d'un moment idem.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut
    Et lorsque les celulles de mon vecteur contiennent, des objets ou des pointeurs d'objet????
    le fait de faire un clear(), va t il liberer la memoire utilisee par ces objets, dans les deux cas pointeur sur un objet et objet lui meme????
    si c'est n'est pas le cas, comment pourrais-je faire pour que cette mémoire soit libérer????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    delete v[i]; // comme ca peut etre ???
    Merci de vos reponses

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Avec un vecteur de valeurs (ex: std::vector< std::string >, std::vector< UneClasse >, tu n'as jamais besoin de delete: Tout est fait par copie et géré par le vecteur.

    Par contre, si tu utilises un vecteur de pointeurs, genre std::vector< UneClasse * >, il faut que tu gères toi-même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete v[i];
    v[i] = NULL;
    Sinon, tu peux aussi utiliser des pointeurs intelligents comme les boost::shared_ptr<>.
    Exemple: std::vector< boost::shared_ptr< UneClasse > >.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut
    Donc pour résumer, si j'ai un vecteur de ce type vector<UneClasse *>, il me suffit de faire:
    [Citation]

    delete v[i];
    v[i] = NULL;

    [/Citation]

    et toutes les références que contenait la celulle en question seront libérée,

    Au fait au moment ou je fais le delete v[i], c'est bien le destructeur de l'objet UneClasse qui sera executer?

    Sinon n'est il pas possible de d'un instancier un objet comme ceci maintenant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     objet = gcnew UneClasse();
    et dans ce cas on a un garbage collector qui fonctionne à l'arrière ou est ce seulement dans le cas des winforms (developpement de GUI avec visual express). Ma question est mal posée mais je ne trouve que très peu d'info sur ce gcnew, alors si vous avez qqch...

    Merci encore les gars.

  9. #9
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    programmant sous linux je ne connais pas cette forme objet = gcnew UneClasse();
    mais ce qui est sur c'est que e n'est pas standard. De plus il n'y a pas de garbage collector en c++. Ce qui s'y apparente le plus sont les smartPointer (cf boost).

    Comme je te l'ai dit si tu stockes des valeurs pas de souci de memoire, un clear liberera la memoire, pas explicitement mais implicitement. Par contre si tu as des pointeurs (allouer avec un new) il te faut utiliser un delete (appel du destructeur). C'est plus contraignant d'où l'utilisation en c++ de smartPointer.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Points : 65
    Points
    65
    Par défaut
    ok merci c'est sympa.

    Le truc qui est un peu lourd avec mon projet c'est que je ne peux pas utiliser la librairie boost, car elle ne fait pas partie du standard.
    Sachant que le projet je ne le ferai pas seule il est difficile d'utiliser une telle librairie car pour celui qui fera la suite ca risque d etre la galère.
    c'est donc très frustrant, je dois me débrouiller comme ca.

    Merci encore

  11. #11
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    Citation Envoyé par chrono23
    ok merci c'est sympa.

    Le truc qui est un peu lourd avec mon projet c'est que je ne peux pas utiliser la librairie boost, car elle ne fait pas partie du standard.
    elle n'en est pas loin.

    Citation Envoyé par chrono23
    Sachant que le projet je ne le ferai pas seule il est difficile d'utiliser une telle librairie car pour celui qui fera la suite ca risque d etre la galère.
    c'est donc très frustrant, je dois me débrouiller comme ca.

    Merci encore
    Tu pourrais faire tes propres smartPointer, il y a un tuto dessus dans le tutoriel de Laurent sur le moteur 3D, mais bon ca prendrais peut-etre trop de temps.

    le plus simple serais d'utiliser un foncteur pour tout supprimer. D'ailleurs maintenant que j'y pense il me semble qu'il y a un exemple dans la FAQ c++.

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Le garbage collector, tu ne l'as qu'en .Net, et là, ce n'est plus du C++, mais du C++/CLI.
    Même en mélangeant code natif et code .Net, on ne peut normalement pas mettre de référence d'objet .Net dans un conteneur de la STL.

    Donc, soit tu gères explicitement la mémoire, soit tu réinventes la roue avec une classe de pointeur intelligent.

  13. #13
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,
    Citation Envoyé par chrono23
    ok merci c'est sympa.
    Le truc qui est un peu lourd avec mon projet c'est que je ne peux pas utiliser la librairie boost, car elle ne fait pas partie du standard.
    Sachant que le projet je ne le ferai pas seule il est difficile d'utiliser une telle librairie car pour celui qui fera la suite ca risque d etre la galère.
    c'est donc très frustrant, je dois me débrouiller comme ca.

    Merci encore
    Deux petites précisions quand même:

    -Il est prévu qu'au moins une bonne partie de boost entre dans le standard sous peu

    -la bibliotheque peut etre implémentée *relativement* facilement sur n'importe quel compilateur, s'il ne l'a pas impémentée d'office...

    Bien que je ne l'aie moi-même jamais utilisée à ce jour pour différentes raisons qui font que, je ne vois personnellement aucune raison de "rester frustré" face à une bibliotheque, peut etre pas encore tout à fait standard, mais en passe de le devenir, plutôt que de l'installer

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Surtout que les 3/4 des bibliothèques de boost sont utilisables simplement en incluant les bons en-têtes (rien à compiler / installer).

  15. #15
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Le truc qui est un peu lourd avec mon projet c'est que je ne peux pas utiliser la librairie boost
    Tu souffres donc du syndrome NIH ? (Not Invented Here)

  16. #16
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    helas nombreux sont ceux qui en sont atteind

  17. #17
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Le RAZ est inutile si c'est pour faire un erase derrière -- l'action la plus probable après un delete d'un élément contenu.

    Une partie de boost, ou du moins celle qui a servi d'inspiration pour ce qui a été retenu pour le C++09, est déjà dispo avec les compilos récents sous std::tr1. Je crois que c'est le cas de VC 2005.

    Il y a, dans boost, des conteneurs spécialisés pour les pointeurs qui sont plus légers que les std::container<boost::shared_ptr<>>.

    Un GC est dispo en C++ depuis très longtemps. Celui de boehm. (et ils ont l'air d'en parler pour le C++09).

    Le NIH est une vraie plaie. Ou comment redévelopper un pseudo vecteur peu sécurisé qui fait en 24h ce qui tiendrait en 4 minutes. :-/

Discussions similaires

  1. DataGridView et WPF problème de libération mémoire
    Par fterf dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 12/03/2009, 08h41
  2. Problème de libération mémoire
    Par boule_t dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 16/02/2009, 09h43
  3. Problème de libération de mémoire
    Par saturne13 dans le forum Linux
    Réponses: 9
    Dernier message: 06/02/2007, 09h18
  4. FIREBIRD + APPLI EN C : Problèmes de libération mémoire
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 16/09/2005, 09h07
  5. [Debutant(e)]problème de libération de mémoire
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/02/2005, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo