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 :

Vector et libération de la mémoire


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    testeur logiciel
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : testeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Points : 211
    Points
    211
    Par défaut Vector et libération de la mémoire
    Edit : Oups je me suis complètement planté de partie du forum si quelqu'un peu me déplacer dans la partie C++...merci

    Bonjour à tous,

    Mon problème est le suivant :

    J'ai un Vector de structures et une structure contient un pointeur sur une classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct MaStructure
    {
        CClasseA * pClasseA 
    };
     
    struct MaStructure TempMaStructure;
    vector <MaStructure> MonVector;
    Je fais un pushback de ma structure temporaire dans le Vector au moment où j'en ai besoin.

    Maintenant je souhaite supprimer une case du Vector.

    Je procède de la façon suivante :

    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
     
    for (int i = 0; i < MonVector.size(); i++)
    {
        TempMaStructure.pClasseA = new CClasseA;
        pushback... 
     
        ...
     
        if (MonVector[i].pClasseA != 0)
        {
            delete MonVector[i].pClasseA;
            MonVector[i].pClasseA = 0;
            MonVector.erase(MonVector.begin()+i); 
        }                      
    }
    S'agit-il d'une bonne solution ou cela comporte t'il des risques de dépassements mémoires ou d'autres choses de ce style ?

    merci d'avance.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut
    Citation Envoyé par Bundy*Al Voir le message
    S'agit-il d'une bonne solution ou cela comporte t'il des risques de dépassements mémoires ou d'autres choses de ce style ?
    Y as l'idée, mais le parcoure est faux. Tu fera un élément sur deux à cause du erase en cours de parcoure.


    Sinon, tu n'as pas besoin de vérifier que le pointeur est =0. delete le fait.
    Vue que tu vide ton vector, delete tous tes pointeur et fait un clear à la fin. Ca evitera des recopie(dû au retrait d'un element) inutile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for (int i = 0; i < MonVector.size(); i++)
    {
        TempMaStructure.pClasseA = new CClasseA;
        pushback... 
     
        ...
     
      delete MonVector[i].pClasseA;
      MonVector[i].pClasseA = 0;                  
    }
    MonVector.clear();
    Il faudrait aussi un construction par défaut pour MaStructure pour mettre à 0 le pointeur


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct MaStructure
    {
        MaStructure() : pClasseA (0) {};
        CClasseA * pClasseA 
    };
    La stl donne fourni un autre type de parcoure des element : les iterators. Tu devrait regarder la faq. Il y as aussi les algorithm qui pourrais t'intéresser:
    http://r0d.developpez.com/articles/algos-stl/

  3. #3
    Membre actif
    Homme Profil pro
    testeur logiciel
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : testeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Points : 211
    Points
    211
    Par défaut
    Citation Envoyé par Mongaulois Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    for (int i = 0; i < MonVector.size(); i++)
    {
        TempMaStructure.pClasseA = new CClasseA;
        pushback... 
     
        ...
     
      delete MonVector[i].pClasseA;
      MonVector[i].pClasseA = 0;                  
    }
    MonVector.clear();
    Merci pour ta réponse.

    Je ne peux pas supprimer le contenu entier du vector avec le clear() car tous les éléments du vector ne sont pas sujet à la suppression.

    Pour entrer dans le détail en fait il s'agit de missiles (jeu 2d) lorsqu'un missile joueur entre en collision avec un missile ennemi alors cela produit une explosion. C'est alors que je fais le new CClasseA (CClasseA = CExplosion)
    Lorsque l'explosion est finie je fais le delete et la suppression de la case du vector concernée car ce missile n'a plus lieux d'être (une structure par missile).
    Dans le cas où il n'y à pas de collision je continu d'afficher le missile et fait le delete et la suppression dans le vector lorsque le missile quitte la zone d'affichage.

    Je vais regarder ce que tu me proposes ce soir.

    Merci

    a+

    Edit: Avec ma solution je rencontre une sortie de mon programme en erreur Windows... en release mais pas en debug.
    Si je commente la ligne vector.erase alors pas de plantage mais je ne libère pas les cases qui ne sont plus utile dans le vector.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Bundy*Al Voir le message
    Avec ma solution je rencontre une sortie de mon programme en erreur Windows... en release mais pas en debug.
    La douce joie du debug...
    Ca arrive souvent que des erreurs de code apparaissent uniquement en release.


    Citation Envoyé par Bundy*Al Voir le message
    Si je commente la ligne vector.erase alors pas de plantage mais je ne libère pas les cases qui ne sont plus utile dans le vector.
    ? Si tu peut m'être le vrai code (au moins ce qu'il faut pour comprendre), ça serait plus simple

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Et si tu travaillais autrement

    En effet, la seule différence qu'il peut y avoir entre une classe et une structure, c'est l'accessibilité des membres par défaut.

    Il est donc tout à fait possible de placer des méthodes dans des structures, dont (principalement) le constructeur et le destructeur.

    Dés lors, ne serait-il pas plus logique que de déléguer la libération dynamique de la mémoire du membre de ta structure... au destructeur de la structure (et, tant qu'à faire, l'allocation dynamique de la mémoire du membre à son constructeur)

    Les choses deviendraient de facto bien plus faciles pour tout le monde

    La structure deviendrait quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct MaStructure
    {
        CClasseA * pClasseA;
        MaStructure(){pClasseA= new CClasseA;}
        ~MaStructure(){delete pClasseA;}
    };
    et tu n'aurais plus qu'à t'inquiéter de remplir l'instance de vector qui va bien

    La libération de la mémoire se faisant automatiquement lors de la destruction de l'instance, ou lorsque tu appelle les méthodes clear() ou erase

  6. #6
    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
    Si l'un de tes membres est un pointeur, il faut l'initialiser dans le constructeur, le libérer dans le destructeur, le copier dans le constructeur par copie et l'affecter dans l'opérateur d'affectation.
    S'il te manque ne serait-ce qu'un seul de ces éléments, ce n'est pas bon.

Discussions similaires

  1. shared_ptr, vector et libération mémoire
    Par killwin dans le forum C++
    Réponses: 3
    Dernier message: 05/09/2012, 02h20
  2. libération de la mémoire pour un vector de pointeur
    Par bobo034 dans le forum Débuter
    Réponses: 7
    Dernier message: 13/08/2008, 17h06
  3. libération de la mémoire après traitement ?
    Par isachat666 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 07/12/2005, 19h29
  4. [VB]Libération de la mémoire
    Par seroa dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 12/10/2005, 11h52
  5. Libération de la mémoire
    Par gibet_b dans le forum Composants VCL
    Réponses: 3
    Dernier message: 30/06/2004, 12h02

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