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 :

intrigue sur la surcharge du new et delete


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut intrigue sur la surcharge du new et delete
    bonjour,

    quelques questions se posent lorsque je pense à la surcharge du new et delete.

    je vois dans la majorité des exemples que le new et delete sont substitués par un malloc et un free.

    problème, comment peut-on faire en sorte que le constructeur de la classe ou le destructeur soient bien appelés avec la surcharge des deux opérateurs ?

    merci

  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
    Le langage appelle le constructeur après le retour de operator new.
    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 émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    Je reprend l'exemple que Loulou24 a donné dans son tutorial sur la création d'un moteur 3D en C++.
    http://loulou.developpez.com/tutorie...artie1/#L2.2.1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    inline void * operator new( size_t ) {
        void * p = malloc( size );
        /// je fais des choses :d
        return p;
    }
     
    inline void operator delete( void * p ) {
        /// je fais des choses :d
        free( p );
    }
    Est-ce que le langage va directement appeler le constructeur ou le destructeur lorsque je ferai appel à ces opérateurs surchargés ?

    Merci

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Si tu fais:oui, si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X* x = operator new(sizeof X);
    non.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 82
    Par défaut
    Oui.

  6. #6
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    je viens de vite faire un test avec l'exemple suivant, et il semblerait qu'effectivement mon constructeur et destructeur sont bien appelés.

    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
     
    #include <iostream>
    #include <memory>
     
    inline void * operator new( size_t t ) {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
        return malloc( t );
    }
     
    inline void operator delete( void * p ) {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
        free( p );
    }
     
    struct Test {
        Test() {
            std::cout << __PRETTY_FUNCTION__ << std::endl;
        }
        ~Test() {
            std::cout << __PRETTY_FUNCTION__ << std::endl;
        }
    };
     
    int main()
    {
        std::auto_ptr< Test > ( new Test() );
    	return 0;
    }
    confirmation de votre part ? et est-ce qu'il y a possibilité d'utiliser autre chose que le malloc ?




    merci

  7. #7
    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
    confirmation de votre part ?
    Pour la troisième fois... Oui.

    et est-ce qu'il y a possibilité d'utiliser autre chose que le malloc ?
    Tout ce que tu veux du moment que tu renvoies un pointeur sur un espace mémoire valide pour la taille demandée.
    Tu peux utiliser les fonctions de ton OS (mais de toute façon les malloc et compagnies finissent par y passer) ; ou encore dans des cas plus particulier tu peux utiliser des pools (mémoire pré-allouée dans laquelle tu ne fais que piocher).

  8. #8
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    Bon, je viens de tester et effectivement cette technique ( celle donnée par Loulou24 ) semble intéressante.

    Je rappel que la technique expliquée par Loulou24 donne la possibilité de tracer les (dés)allocations à l'aide d'un gestionnaire de mémoire.

    Par contre, elle ne me semble pas appropriée avec l'utilisation de pointeur intelligent et surtout lorsque l'on réalise un release du pointeur encapsulé.

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Je rappel que la technique expliquée par Loulou24 donne la possibilité de tracer les (dés)allocations à l'aide d'un gestionnaire de mémoire.
    Pas besoin de ça pour tracer les allocations mémoire.

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

Discussions similaires

  1. question sur new et delete
    Par yann458 dans le forum C++
    Réponses: 15
    Dernier message: 09/08/2014, 19h52
  2. Surcharge de new / delete et Memory Manager
    Par LittleWhite dans le forum C++
    Réponses: 11
    Dernier message: 18/10/2010, 23h56
  3. Réponses: 18
    Dernier message: 07/10/2010, 02h18
  4. Segmentation fault sur new[] et delete[]
    Par Don ViP dans le forum C++
    Réponses: 4
    Dernier message: 30/04/2006, 00h29
  5. Namespace et surcharge operator new/delete
    Par ZeLegolas dans le forum C++
    Réponses: 11
    Dernier message: 26/07/2005, 13h55

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