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

MFC Discussion :

Problème de destruction


Sujet :

MFC

  1. #1
    Membre confirmé Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Par défaut Problème de destruction
    Salut

    J'ai implémenté le pattern command.
    J'ai une classe project qui va pouvoir exécuter plusieurs command.

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    class Project {
    public:
        Project();
        ~Project();
        void addCommand(Command*); // ajouter une commande
        void start(); //exécuter les commandes
     
    private:
        CArray<Command*,Command*> ArrayCommands; //liste de commandes
    };
     
    Project::Project()
    {
     
    }
     
    Project::~Project()
    {
     Command* pCommand=NULL;
     for (int i=0; i < ArrayCommands.GetSize() ; i++ ) 
     { 
      pCommand=(Command*)ArrayCommands.GetAt(i); 
      if(pCommand) 
         delete pCommand;		
     } 
     ArrayCommands.RemoveAll(); 
    }
     
    void Project::start()
    {
     for (int i=0; i < ArrayCommands.GetSize() ; i++ )
     {
      if(ArrayCommands.GetAt(i))
         ArrayCommands.GetAt(i)->execute();
     }
    }
     
    void Project::addCommand(Command* _Command)
    {
     ArrayCommands.Add(_Command);
    }
    Si je créé une commande, que je l'ajoute au projet, que j'en crée une autre que j'ajoute également => aucun problème.

    Maintenant si je souhaite exécuter plusieur fois une commande, donc je crée une seul fois, mais que j'ajoute plusieur fois au projet
    Je me fais insulter à la sortie du programme.
    Blablabla... The memory could not be read.
    Je sais que c'est`au moment du delete pCommand; que survient cette erreur.

    Logiquement ce qui devrait se passer : première itération de la boucle for, pCommand pointe sur la commande créé et est ensuite délété.
    2ème itération : "ArrayCommands.GetAt(i)" devrait retourner un pointeur NULL. Et donc le delete ne devrait pas avoir lieu... pourtant il a lieu...


  2. #2
    Membre expérimenté
    Inscrit en
    Mars 2004
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 425
    Par défaut
    Et si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(pCommand != NULL) 
         delete pCommand;

  3. #3
    Membre confirmé Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Par défaut
    Pareil...

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    Logiquement ce qui devrait se passer : première itération de la boucle for, pCommand pointe sur la commande créé et est ensuite délété.
    2ème itération : "ArrayCommands.GetAt(i)" devrait retourner un pointeur NULL. Et donc le delete ne devrait pas avoir lieu... pourtant il a
    le delete d'un pointeur ne remet pas l'adresse a zero dans le Carray.
    il manque un SetAt(i,NULL) dans ta boucle .


  5. #5
    Membre confirmé Avatar de loupdeau
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 125
    Par défaut
    En faisant ca, ca semble marcher :

    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
    Project::~Project()
    {
     Command* pCommand=NULL;
     
     for (int i=0; i < ArrayCommands.GetSize() ; i++ ) 
     { 
       pCommand=ArrayCommands.GetAt(i);
     
       for (int j=i; j < ArrayCommands.GetSize() ; j++ ) 
         if(pCommand==ArrayCommands.GetAt(j))
            ArrayCommands.SetAt(j,NULL);
     
       if(pCommand)
          delete pCommand;		
     } 
     ArrayCommands.RemoveAll(); 
    }
    A chaque fois je parcours ArrayCommands pour voir si y a le même pointeur, et si c'est le cas je fais SetAt(j,NULL);


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

Discussions similaires

  1. [Gtkmm] Problème de destruction
    Par Anium dans le forum GTK+
    Réponses: 2
    Dernier message: 19/01/2008, 22h36
  2. Problème de destruction dynamique d'Applet
    Par EvAyla dans le forum Applets
    Réponses: 1
    Dernier message: 13/06/2007, 21h48
  3. Réponses: 5
    Dernier message: 27/03/2007, 09h51
  4. Problème de destruction de session
    Par nmathon dans le forum Langage
    Réponses: 3
    Dernier message: 15/08/2006, 16h42
  5. problème de destruction de composants dynamique
    Par gandf dans le forum C++Builder
    Réponses: 4
    Dernier message: 23/08/2005, 10h39

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