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 :

comment fonctionne l'opérateur new


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    août 2013
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 270
    Points : 56
    Points
    56
    Par défaut comment fonctionne l'opérateur new
    bonjour à tous,

    j'utilise très très souvent l'opérateur new dans mes codes pour faire de l'allocation dynamique, mais je ne comprends pas du tout son implémentation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyClass * p1 = new MyClass[5];
    Par exemple, si je crée une classe MyNew :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MyNew
    {
    //blablabla
     
        void* operator[](int size)
        {
            //j'alloue une taille de size octet(s) dans le tas
            return ptr;
        }
    };
    Si alors je veux allouer un pointeur avec ma classe MyNew je dois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MyNew myNew;
    int main()
    {
         int* ptr = myNew[10 * sizeof(int) ];
    }
    en aucun cas j'ai la syntaxe : MyClass * p1 = new MyClass[5];.
    Comment je peux faire ?

    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    1 004
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 1 004
    Points : 5 049
    Points
    5 049
    Par défaut
    Bonjour,

    new n'est pas une classe ni une fonction, tu l'a écris toi-même c'est un opérateur. Tout comme le sont +, -, sizeof ou typeid ou delete.
    On ne peut donc pas créer un "new". On peut par contre le surcharger comme on peut surcharger + ou - ou delete (évidement sizeof ou typeid eux ne peuvent pas être surchargés).

    Et attention, tu dis très souvent utiliser new, il semble donc que tu n'as pas bien compris quand on doit utiliser new (et fait on ne doit normalement JAMAIS l'appeler directement, la bibliothèque nous fournit les objets qui savent l'utiliser intelligemment.)

    Je ne comprends pas bien quel est ton besoin.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    août 2013
    Messages
    270
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : août 2013
    Messages : 270
    Points : 56
    Points
    56
    Par défaut
    merci pour ta réponse.

    effectivement j'étais à l'ouest en ce qui concerne 'new' je pensais que c'était un objet comme cout ou cin et qu'on avait créé l'operator [] dans la classe.

    Mais en faite new est comme un +,-,/,* ce qui peut parraitre un peu déroutant pour un débutant. Pourquoi avoir créer un operator et non une fonction comme en C qui parait plus simple à premiere vu pour la compréhension.

    alors le besoin c'est uniquement de comprendre l'operateur new, c'est juste pour la curiosité

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    octobre 2004
    Messages
    11 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : octobre 2004
    Messages : 11 288
    Points : 28 050
    Points
    28 050
    Par défaut
    Salut,
    Citation Envoyé par cosmoff Voir le message
    Mais en faite new est comme un +,-,/,* ce qui peut parraitre un peu déroutant pour un débutant. Pourquoi avoir créer un operator et non une fonction comme en C qui parait plus simple à premiere vu pour la compréhension.
    Attention, les opérateurs sont des fonctions, par nature, même si ce sont des fonctions particulières

    La seule chose, c'est que le langage fournit un moyen "plus simple" de les utiliser, correspondant d'avantage ce que l'on a l'habitude de faire

    Un petit exemple, avec l'opérateur + : Quand tu veux surcharger ton opérateur + pour un type particulier (mettons un point), tu vas écrire un code ressemblant à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Point operator + (Point const & a, Point const & b){
        /* toute la logique nécessaire */
        return pointTemporaire;
    }
    On se rend donc bien compte qu'il s'agit d'une fonction tout à fait classique par la manière dont on en défini le comportement

    Et, pourtant, quand tu effectue une addition sur ta feuille de papier, tu vas écrire quelque chose ressemblant à 4 + 3; et non quelque chose ressemblant à add(4, 3).

    Ce n'est donc vraiment qu'une possibilité de faire les choses "plus simplement", sans devoir passer par l'appel (fort lourd au demeurant) d'une fonction
    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

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    décembre 2015
    Messages
    1 004
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : décembre 2015
    Messages : 1 004
    Points : 5 049
    Points
    5 049
    Par défaut
    Citation Envoyé par cosmoff Voir le message
    Mais en faite new est comme un +,-,/,* ce qui peut parraitre un peu déroutant pour un débutant. Pourquoi avoir créer un operator et non une fonction comme en C qui parait plus simple à premiere vu pour la compréhension.
    Ça n'est pas une fonction car c'est impossible de créer une fonction qui joue ce rôle. L'opérateur new reçoit comme donné de travail un type. Et un type ça ne peut pas être un paramètre de fonction. Il nous reste quand même les template-fonctions qui sont paramétrables, ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template<typename T,typename ...UU> T* monNewTemptative1( UU&& prms... ) {
       return  new T(std::forward<UU>(prms)...);  // Ouais mais finalement je triche car je revient à new qui sait créer des types!
    }
    template<typename T,typename ...UU> T* monNewTemptative2( UU&& prms... ) {
       char*  buffer = malloc( sizeof (T) );      // j'ai réussi à contourner l'allocation faite par new  
       new(buffer) T(std::forward<UU>(prms)...);  // mais Ouais je dois tricher encore en utilisant l'opérateur de new-en-place
       return  reinterpret_cast<T*>( buffer );
    }
    Ces template (surtout sous cette forme) n'existaient pas au début du C++, mais même eux n'arrivent pas à émuler ce que fait l'opérateur new. NOn vraiment new n'est pas du tout une fonction, ni un objet.

Discussions similaires

  1. Comment minimiser les appels à l'opérateur new
    Par ClementVidal dans le forum Langage
    Réponses: 10
    Dernier message: 17/09/2012, 17h27
  2. Comment fonctionne le new
    Par alen dans le forum Langage
    Réponses: 5
    Dernier message: 23/06/2009, 09h50
  3. Comment fonctionne l'opérateur "=" ?
    Par BassBeat dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/04/2007, 11h47
  4. Comment fonctionne le ClassExplorer ?
    Par borisd dans le forum C++Builder
    Réponses: 7
    Dernier message: 30/09/2004, 18h44
  5. Comment fonctionne le CVS ?
    Par mathieu dans le forum CVS
    Réponses: 6
    Dernier message: 23/03/2004, 12h26

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