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++

  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
    Points : 1 051
    Points
    1 051
    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 : 39
    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
    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
    Points : 1 051
    Points
    1 051
    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 expérimenté
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    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;
    En premier lieu, utilisez un moteur de recherche.
    En second lieu, postez sur le forum adéquat !

  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
    Points : 1 051
    Points
    1 051
    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 sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    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.

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    ces deux tableaux sont des tableaux d'uchar donc pas de type complexe

    mais le soucis est ailleurs car le point d'arret suivant n'est JAMAIS atteint

    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
    Image::~Image(void)
    {
      // point d'arret
    
      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
    }

  8. #8
    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 : 39
    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
    Je n'ai aucune idée de pourquoi ton destructeur n'est jamais appelé, mais pour ce qui est de ça :
    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.
    C'est une mauvaise excuse. Les std::vector ne sont qu'une encapsulation des tableaux dynamiques classiques, ils ne leurs enlèvent aucune fonctionnalité.
    Y a même une entrée dans la FAQ pour l'utilisation avec des fonctions C :
    http://c.developpez.com/faq/cpp/?pag...teneurs_avec_c

  9. #9
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Peux tu me montrer ce que donne ce code avec un vector, car je ne vois pas bien ?

    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
      uchar* donnees = 0;
      unsigned int taille;
    
      HANDLE fp = 0;
      
      char fichier[256] = "C:\\image.tga";
      
      fp = CreateFile( fichier, FILE_READ_DATA, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_NO_BUFFERING, 0);
    
      if (!fp)
          {
            MessageBox (0, "erreur: fichier non trouve ou bloque ", fichier,0);
            return 0;
          }
    
        // recuperation de la taille du fichier
        taille = GetFileSize(fp,0);
        
        // allocation des donnees pour charger l'image
        donnees = new uchar[ taille ];
      	
        DWORD read;
        // lecture du fichier image d'une traite
        ReadFile(fp, donnees, sizeof(uchar)*taille, &read, 0);
    
        // fermeture du fichier
         CloseHandle  (fp);
        
        delete [] donnees;

  10. #10
    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 : 39
    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
    6
    // allocation des donnees pour charger l'image
    donnees.resize(taille);
     
    DWORD read;
    // lecture du fichier image d'une traite
    ReadFile(fp, &donnees[0], sizeof(uchar)*taille, &read, 0);

  11. #11
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Ok j'y penserai pour la prochaine fois car pour le moment la manipulation de uchar* ne me gene nul part.

    pour revenir a mon probleme je viens de voir un warning que j'avais zappé
    Citation Envoyé par bill gates
    warning C4150: deletion of pointer to incomplete type 'Image'; no destructor called
    En gros j'avais oublié l'include "Image.h"
    La compilation passait car je n'utilisais aucune methode membre de l'Image recuperee et je devais faire un class Image; quelque part dans les autres includes...

    bref résolu.

  12. #12
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par NiamorH
    Ok j'y penserai pour la prochaine fois car pour le moment la manipulation de uchar* ne me gene nul part.
    Ca risque de te géner plus vite que prévu !

  13. #13
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    C'est vrai lorsqu'on manipule des chaines de caracteres et que l'on veut recupere des sous chaines, detecter certains caracteres clefs faire de la concatenation, j'ai un passage comme ça dans mon appli où j'ai vraiment galéré et à l'avenir j'essayerai d'utiliser des strings, mais dans ce cas ce sont des donnees pixels RGB dont la taille de varie pas de la creation a la deletion.

    Non non, la partie decodage de mon appli sur ces tableaux est bien rodee et je retrouve en sortie mes images tels quelles. Aucun probleme de corruption de heap non plus.

  14. #14
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    pour revenir a mon probleme je viens de voir un warning que j'avais zappé

    bill: gates a écrit :
    warning C4150: deletion of pointer to incomplete type 'Image'; no destructor called
    Les warning ne sont donc pas seulement des éléments décoratifs ?
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  15. #15
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    celui ci etait caché parmis les : < attention ! printf est une fonction deprecated >

    Je n'en ai pas d'autres à part ceux ci : http://www.developpez.net/forums/sho...d.php?t=324737

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par NiamorH
    celui ci etait caché parmis les : < attention ! printf est une fonction deprecated >
    Il me semble que printf() elle-même n'est pas deprecated.
    Mais bon, un petit #define _CRT_SECURE_NO_DEPRECATE suffit à faire taire ses warnings qui encouragent la non-portabilité (surtout parfois pour des trucs absolument débiles, comme fopen_s()...)
    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.

  17. #17
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Effectivement, j'ai uniquement du sprintf, strcpy, strncpy et du strtok.

    Pas mal ton astuce je vais tester.

    EDIT : J'ai toujours 'strdup' deprecated

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    • sprintf : Pour moi, le mieux est d'utiliser un truc qui reproduit le comportement standard du snprintf C99 : http://www.developpez.net/forums/sho...8&postcount=14
    • strcpy, strncpy : C'est vrai qu'elles sont dangereuses, toutes les deux. Une bonne utilisation de strncat() peut être préférable (même s'il l'ont dépréciée aussi )
    • strtok() n'est en effet pas réentrante. La dernière version propose un équivalent direct à la version réentrante POSIX strtok_r(), sous le nom strtok_s().
    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.

  19. #19
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Laurent Gomila
    Je n'ai aucune idée de pourquoi ton destructeur n'est jamais appelé, mais pour ce qui est de ça :

    C'est une mauvaise excuse. Les std::vector ne sont qu'une encapsulation des tableaux dynamiques classiques, ils ne leurs enlèvent aucune fonctionnalité.
    Y a même une entrée dans la FAQ pour l'utilisation avec des fonctions C :
    http://c.developpez.com/faq/cpp/?pag...teneurs_avec_c
    Hum Laurent, je vais de tester tes dires sur un bout de mon projet.

    Voici la fonction "C" à invoquer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    extern "C" int IRimages_pas( int num_choc, int camera, long image_deb,
    						 long image_fin, long pas, unsigned short ** Images );
    Voici comment je l'appelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::vector<unsigned short>* image;
    image->reserve(77120);
    	
    int cr  = IRimages(getChocNum(), numero_camera, num_image, num_image, &image[0]);
    Et j'ai l'erreur suivante :
    error C2664: 'IRimages' : impossible de convertir le paramètre 5 de 'std::vector<_Ty> *__w64 ' en 'unsigned short **'
    ?? ??

    Je comprend pas !

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu passes un vecteur de short à un unsigned short **
    Cela fait une étoile de trop pour que le vecteur soit utilisable.
    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.
Page 1 sur 2 12 DernièreDernière

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