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

SL & STL C++ Discussion :

Libération d'un vector de pointeurs


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Par défaut Libération d'un vector de pointeurs
    Bonjour,

    J'ai une exception lors de la libération d'un vector de pointeurs.

    Le sujet a été plusieurs fois abordés sur ce forum, et dans la faq, et une petite recherche m'a permi de trouver ce sujet (entre autres).
    A prioris, j'ai l'impression de faire les choses correctements, mais dans la pratique, ça plante .

    Voici une partie de mon code incriminé:

    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
    16
    17
    18
     
    simulator5ax::toolpath *TheToolPath;
     
    //
    std::vector<simulator5ax::toolpath*> toolpath_array;
     
    //
    for (t_int i = 0; i<VSSimulatorParam.lm_Sim_ToolPath.total; i++){
      TheToolPath = new simulator5ax::toolpath(TheTool); //pointeur vers un nouveau ToolPath
      //SetMoves_To_ToolPath(VSSimulatorParam.lm_Sim_ToolPath.q[i],TheTool,TheToolPath); //Remplissage du ToolPath
      toolpath_array.push_back(TheToolPath); //le place dans le vecteur
    }
     
    //
    for (std::vector<simulator5ax::toolpath *>::iterator i = toolpath_array.begin(); i != toolpath_array.end();++i)
      delete *i;
     
    toolpath_array.clear();
    Au debuggeur, c'est une fois les 2 iterateurs nettoyés, et au moment du 're-passage sur la ligne du for' pour sortie, que l'exception a lieu.

    Exception $C0000005 ACCESS_VIOLATION at $13451F0D, write of address $39CF5D00 11:03:17:591
    Voyez-vous d'où pourrait venir mon problème?

    Merci d'avance pour votre aide.

    Cordialement,

    Benjamin

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    ce n'est pas trés clair pour moi
    Citation Envoyé par Grosbenji Voir le message
    Au debuggeur, c'est une fois les 2 iterateurs nettoyés, et au moment du 're-passage sur la ligne du for' pour sortie, que l'exception a lieu.
    2 itérateurs? Je n'en vois qu'un: i. Et puis je ne comprend pas ce que tu veux dire par "nettoyer un itérateur".

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Par défaut
    Bonjour,

    Effectivement, cela n'est pas trés clair, désolé.

    En fait, pour chaque itération de la boucle for, mon objet désigné par l'itérateur semble être bien nettoyé.
    Et la plantage a lieu une fois l'ensemble des itérations effectuées, au moment du test de sorti de la boucle for.

    Merci

    Cordialement,

    Benjamin

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Ok je vois.

    Mais je ne comprend pas ton erreur. A moins avis elle doit être ailleurs. As-tu posté tout le code?

    Par exemple, le code suivant fonctionne parfaitement:
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #include <vector>
    #include <string>
     
    class A
    {
    public:
        explicit A(int num, std::string str):_num(num), _str(str) {}
     
    private:
        int         _num;
        std::string _str;
    };
     
    int main()
    {
        std::vector<A*> v;
        A* pA;
        pA = new A(1, "toto");
        v.push_back(pA);
        pA = new A(2, "titi");
        v.push_back(pA);
     
        for (std::vector<A*>::iterator it = v.begin(); it!=v.end(); ++it)
            delete *it;
     
        v.clear();
     
        return 0;
    }
    Quel compilateur utilises-tu?

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Ha... je crois que j'ai compris.

    Fais voir le code du constructeur de TheToolPath.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Par défaut
    Re Bonjour

    Merci pour ton aide.

    Je n'ai pas le code du constructeur de TheToolPath, et c'est bien là tout mon problème

    En fait je travaille en ce moment sur l'intégration dans notre projet, d'un simulateur déveleloppé par une autre société.
    Je n'ai donc que la dll, l'interface et un code minimaliste de démonstation.

    Mais en me demandant cela, j'ai fini par trouvé le problème, et tu m'as grandement mis sur la voie .
    Tous mes Toolpath utilisaient le même 'TheTool', dans leur constructeur.
    'TheTool' est un pointeur vers un objet tool.
    Et lors du delete de mon premier ToolPath, j'imagine que cet objet 'Tool' était lui aussi nettoyé.
    D'où un soucis pour le deuxième delete.

    Merci pour ton aide.

    Cordialement,

    Benjamin

    Edit C'était bien ça

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. 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
  2. Réponses: 13
    Dernier message: 03/10/2005, 18h06
  3. pb avec vectors de pointeurs
    Par e-teo dans le forum SL & STL
    Réponses: 5
    Dernier message: 27/07/2005, 14h11
  4. Réponses: 8
    Dernier message: 26/08/2004, 18h59
  5. vector de pointeurs sur des objet
    Par jean-bobby dans le forum SL & STL
    Réponses: 26
    Dernier message: 06/08/2004, 14h54

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