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 :

Fonction "set_new_handler" et fichier d'en-tête <new>


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 15
    Par défaut Fonction "set_new_handler" et fichier d'en-tête <new>
    Bonjour,

    Je débute en c++ et j'ai encore du mal à trouver l'information que je recherche...

    Je me permets donc une petite question :
    Pour utiliser la fonction "set_new_handler" afin de gérer les dépassements de mémoire, dois-je déclarer le fichier d'en-tête <new>?

    En effet, le nom de cette fonction lors de mon cours a été donné et j'ai été sur la page suivante pour en savoir plus (syntaxe, fichier header à utiliser etc) :
    http://www.cplusplus.com/reference/s...t_new_handler/

    J'ai cru comprendre que cette fonction "appartenait" au header <new>... Mais cela marche sans! Pourquoi?

    De même les opérateurs new[] et delete[] semblent provenir de <new> mais je n'ai pas besoin de déclarer le fichier d'en-tête <new> pourtant?

    Merci d'avance pour vos réponses. Je le répète, mon niveau est faible et je n'ai pas encore fait de programmation objet (même si j'ai une petite idée de ce que c'est).

  2. #2
    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
    set_new_handler() sert seulement à modifier le comportement par défaut de new en cas d'échec de l'allocation: Tu n'en as pas besoin si le comportement par défaut (qui consiste à lancer une exception std::bad_alloc) te suffit.
    Note: Changer le handler ne permet pas de faire en sorte que new retourne un pointeur nul en cas d'échec. Donc, sortez un peu du C.

    Pour ce qui est du header, j'ignore pourquoi set_new_handler() marche sans.
    Mais pour le fait que new[] et delete[] n'aient pas besoin de <new>, c'est normal, ce sont des mots-clés du langage, pas des objets ou fonctions.
    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.

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Il me semble que new et delete sont même des "operator". Ils peuvent être surchargés. Ca peut être intéressant de les contrôler dans le contexte particulier d'une classe.

  4. #4
    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 camboui Voir le message
    Il me semble que new et delete sont même des "operator". Ils peuvent être surchargés.
    Yes sir !!
    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
    .

  5. #5
    screetch
    Invité(e)
    Par défaut
    un autre fichier peut avoir inclu "new", c'est un des fichiers dont tous les autres fichiers dependent

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par remjg Voir le message
    Je débute en c++ et j'ai encore du mal à trouver l'information que je recherche...

    Je me permets donc une petite question :
    Pour utiliser la fonction "set_new_handler" afin de gérer les dépassements de mémoire, dois-je déclarer le fichier d'en-tête <new>?
    Il n'y a pas besoin de set_new_handler pour gérer les dépassements mémoire. Par défaut, une allocation mémoire qui échoue lance une exception bad_alloc, ce qui est largement suffisant pour gérer les choses.

    Honnêtement, je ne vois pas trop l'intérêt de cette fonction, surtout pour un débutant dans la langage.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    screetch
    Invité(e)
    Par défaut
    je suis d'accord sur le fait que c'est un detail pour quelqu un qui débute
    mais tu comptes encadrer tous tes new de blocs try/catch ???
    set_new_handler permet d'effectuer une action, quel que soit le code qui appelait new

  8. #8
    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
    Mais set_new_handler ne permet pas d'éviter un try/catch, vu que les deux seules sorties possibles du handler sont le lancer d'exception ou le 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.

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par screetch Voir le message
    je suis d'accord sur le fait que c'est un detail pour quelqu un qui débute
    mais tu comptes encadrer tous tes new de blocs try/catch ???
    set_new_handler permet d'effectuer une action, quel que soit le code qui appelait new
    Non, je compte mettre un bloc try/catch unique au niveau du main qui en cas de bas_alloc affiche simplement "Désolé, plus assez de mémoire, je me tue" (avec éventuellement un dump de l'état de la machine). Il y a bien des gestions d'erreur plus fines possibles, mais ça me semble déjà bien suffisant dans la majorité des cas (et avoir mieux demande beaucoup plus d'efforts), et en plus, ça reste compatible avec des modes plus fin localisés à quelques endroits précis.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    screetch
    Invité(e)
    Par défaut
    oui effectivement ca n'apporterait pas grand chose, si ce n'est d'avoir la callstack complete de l'allcoation (qui a quelques chances d'etre l'allocation qui a tout fait foirer mais c'est meme pas sur)

  11. #11
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Mon compilateur (VC++) permet en mode debug lors du lancement d'une exception d'arrêter le programme au moment où elle est lancée, quel que soit le code qui la lance, et non simplement en mettant un breakpoint manuel là où elle est attrapée. C'est assez indispensable.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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