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 :

destructeur pas appelé ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut destructeur pas appelé ?
    Bonjour,

    j'ai un problème, le destructeur d'une de mes classe n'est pas appellé lors d'un delete.

    Ici je passe bien par le delete, l'objet Image recupere du tampon est bien valide avec des attributs memebres cohérents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
          if (m_tampon_image->attendreFileImagesDecodeesPlusVide())
          {
            Image* im = m_tampon_image->defilerImageDecodee();
            
            if (im)
            {
              dessiner();
              delete im;
              m_compteur->tic();
            }
          }
    Mais son destructeur n'est pas appelé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Image::~Image(void)
    {
      if (m_donnees_fic)
        delete [] m_donnees_fic;
     
      if (m_pixels_decode)
        delete [] m_pixels_decode;
     
     
    #if defined DEBUG_TAMPON_IMAGE
      fprintf(stderr,"Destructeur Image\n");
    #endif
    }
    J'instancie mes images comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      // creation d'une image
      im = new Image(header->width,header->height);
      // passage des donnees utiles
      im->setDonnees(donneespixels, donnees, entete, code_format_tga);
     
      return im;
    Ma classe Image n'est pas heritee ni n'herite de quoi que ce soit, le destructeur n'est pas declaré virtuel...

    Cela vous est il deja arrivé ?

  2. #2
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Si tu fais une exécution pas à pas, il passe par où ?

    PS : si tu utilisais std::vector pour tes tableaux dynamiques, tu n'aurais pas besoin de destructeur.

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par Laurent Gomila
    Si tu fais une exécution pas à pas, il passe par où ?
    Si je n'ai qu'une image, il fait bien le new Image, ensuite j'utilise mon image (je la decode), puis il passe par le delete en gras, mais il ne passe jamais par le destructeur.

    Citation Envoyé par Laurent Gomila
    PS : si tu utilisais std::vector pour tes tableaux dynamiques, tu n'aurais pas besoin de destructeur.
    Je ne comprends pas comment je pourrais l'utiliser ici. Si tu fais référence à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_tampon_image->defilerImageDecodee();
    sache que derriere il y a :
    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
    /**
     * @brief Enleve une image decodee de la file d'image decodee FIFO/PEPS
     * @return L'image decodee defilee
     */
    Image*
    TamponImage::defilerImageDecodee()
    {
      m_sec_crit_file_decodee.entrer();
      Image* im = m_deque_images_decodees.front();
      m_deque_images_decodees.pop_front();
      m_sec_crit_file_decodee.sortir();
     
      if (m_autoriser_remplissage)
        verifierEvenementsFileDecodee();
     
      return im;
    }

  4. #4
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector <???> m_donnees_fic;
    std::vector <???> m_pixels_decode;

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    non ce n'est pas une bonne idee car ce sont des donnees brutes que je dois pouvoir passer en argument de fonctions systeme du style CreateDIBSection ou meme ReadFile.
    Mais a la limite le probleme n'est pas la, je pourrais les deleter à la main de l'exterieur.

    J'essaye de comprendre les raisons pour lesquelles un destructeurs n'est pas appelé ??

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Si m_donnees_fic est un tableau de pointeurs, le destructeurs des objets qu'ils pointent ne seront pas appelés automatiquement : Détruire un pointeur ne fait pas de delete dessus, il y a les types "pointeurs intelligents" pour ça.
    Exemples : le std::auto_ptr<> est un pointeur intelligent minimal à sémantique de transfert, les pointeurs intelligents de boost sont plus complexes (compteurs de références, etc.)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Un destructeur qui n'est pas appelé ?
    Par souki22 dans le forum C++
    Réponses: 7
    Dernier message: 30/01/2015, 10h19
  2. Réponses: 9
    Dernier message: 07/10/2006, 10h54
  3. [destructeur] [pas appelé]
    Par Gonath dans le forum C++
    Réponses: 11
    Dernier message: 23/02/2006, 18h37
  4. [servlet][filtre] filtre qui n'est pas appelé
    Par felix79 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 29/06/2005, 20h09
  5. setTimeOut ne peu pas appeler une fonct. et appeler une var?
    Par bywazy dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 15/06/2005, 09h56

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