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 :

operateur delete et exception


Sujet :

C++

  1. #1
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut operateur delete et exception
    Bonjour,

    Je suis en train de redéclarer les operateur new et delete globaux et le compilateur me signale une erreur parce que je lève une exception dans mon operateur delete.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void operator delete(void * Pointer)
    {
       // check the pointer
       if(Pointer == NULL)
          throw new CException(...);
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1>memory.cpp(337) : error C2220: avertissement consid‚r‚ comme une erreur - aucun fichier 'object' g‚n‚r‚
    1>memory.cpp(337) : warning C4297: 'operator delete'*: la fonction lève une exception alors qu'elle est présumée ne pas le faire
    Est ce normal docteur ? (je suppose que oui)
    Mais surtout, pourquoi ce comportement
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    avec gcc tout marche sans problème.

    De plus, pour lancer une exception, ne vaut pas-t-il mieux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void operator delete(void * Pointer)
    {
       // check the pointer
       if(Pointer == NULL)
          throw CException(...);
    }
    et après attraper l'exception avec un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     try {
      ...
    } catch (CException &ex)
    {
      ...
    }
    Sinon as-tu essayé la syntaxe suivante?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void operator delete(void * Pointer) throw (CException*)
    {
       // check the pointer
       if(Pointer == NULL)
          throw new CException(...);
    }

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void operator delete(void * Pointer)
    ou
    void operator delete(void * Pointer) throw (CException &)
    ou
    void operator delete(void * Pointer) throw (CException *)
    {
       // check the pointer
       if(Pointer == NULL)
       {
          throw new CMcrException(...);
       }
    ...
    }
    Même message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1>memory.cpp(338) : error C2220: avertissement consid‚r‚ comme une erreur - aucun fichier 'object' g‚n‚r‚
    1>memory.cpp(338) : warning C4297: 'operator delete'*: la fonction lève une exception alors qu'elle est présumée ne pas le faire
    En fait, c'est un warning mais je voudrais comprendre pourquoi.
    J'ai oublié de spécifier mon envoronnement de développement : Visual Studio 2005 professional
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Sans doute parce que par défaut, un operator delete sous Visual est supposé être en __declspec(nothrow), quelle que soit la spécification d'exception au-dessus...

    Peut-être aussi que la CRT de Visual ne supporte pas d'exception dans un delete et que ça mène directement à unexpected()/terminate()...
    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.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Sauf erreur, un destructeur n'est pas sensé lancer une exception...

    delete NULL est simplement sans effet, et un delete sur une adresse "valide" mais mal gérée (j'entends par là le fait que l'on essaye de faire un delete sur une adresse qui ne correspond pas à celle que l'on croit ) n'est de toutes façons pas détectable (jusqu'au "crash" du fait de l'erreur de segmentation)

    Ceci dit, et en tout état de cause, il faut éviter de passer par des pointeurs sur les exceptions:

    Elles sont lancées par valeur et récupérées par référence (ne serait-ce que parce que new est lui-même susceptible de lancer une exception de type bad_alloc )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Les exceptions C++ standard peut-être, mais les exceptions MFC (CException etc.) sont allouées dynamiquement et lancées et captées par pointeur non-const. (et on les détruit en appelant leur fonction membre virtuelle Delete()).

    Et ce, parce que le système d'exceptions de MFC date d'avant la standardisation des exceptions C++. Les plus vieilles versions de MFC n'utilisaient même pas les exceptions C++ dans leur système d'exception!
    Depuis, MFC a évolué, mais pour la compatibilité, on reste "par pointeur" pour tout ce qui dérive de CException.
    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
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Ah... au temps pour moi...

    Je dois reconnaitre que la MFC a toujours été quelque chose qui m'a rebuté

    Mettons donc que je n'ai rien dit
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Ceci dit, et en tout état de cause, il faut éviter de passer par des pointeurs sur les exceptions:

    Elles sont lancées par valeur et récupérées par référence (ne serait-ce que parce que new est lui-même susceptible de lancer une exception de type bad_alloc )
    J'accepte la remarque et corrige mon code en conséquence.

    Mais cela ne résoud pas ma question principale...
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Ben en fait, une grande partie des "défauts" de MFC sont dues au fait que ça date d'avant les standards...
    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.

  10. #10
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    C'est lié à ça.
    Un peu plus de précisions dans Exceptional C++ (Item 16) qui contient 2 guidelines qui en substance soulignent que pour obtenir des garanties pour pouvoir écrire du code exception-safe il convient de ne pas laisser sortir une exception d'un destructeur ou d'un delete.

    MAT.

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

Discussions similaires

  1. Supprimer l'operateur delete[]
    Par yamashi dans le forum Langage
    Réponses: 2
    Dernier message: 03/10/2011, 15h05
  2. Réponses: 7
    Dernier message: 23/05/2006, 11h32
  3. surcharge operateur delete et héritage
    Par Hervé dans le forum C++
    Réponses: 5
    Dernier message: 29/03/2006, 13h59
  4. operateur delete
    Par ep31 dans le forum C++
    Réponses: 7
    Dernier message: 24/11/2005, 00h46
  5. [MFC] ADO et operateur delete
    Par 0xYg3n3 dans le forum MFC
    Réponses: 9
    Dernier message: 26/03/2005, 14h38

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