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 :

question sur l'opérateur new


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut question sur l'opérateur new
    Bonjour

    J'ai une question sur l'opérateur new.
    Quand je lance le programme suivant, la valeur par défaut de l'opérateur size est 1.

    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
    class X {
    public:
         static void * operator new(size_t size);
    	 static void * operator new(size_t, new_handler ) ; 
    };
     
    void * X::operator new(size_t size, new_handler p){
       set_new_handler(p);
       return ::operator new(sizeof(X)*size); 
    }
     
    void* X::operator new(size_t size){
    		  return ::operator new(sizeof(X)*size);   
    	  };
     
     
    void specialErrorHandler(){
    	cerr<<"Erreur!!!";//il vaut mieux utiliser cerr+abort() que cout
    	abort();
    }
     
     
    int main(){
     
    X *px1 =new(specialErrorHandler) X; // calls X::operator new
     
    X *px2 = new X; // error!
    }
    Je voudrais déjà savoir si c'est possible de modifier la valeur par défaut pour ne plus qu'elle soit fixée à 1? Par exemple:
    X *px2=new(2) X, mais le compilateur refuse un tel appel.


    Plus généralement,
    quelle est la différence entre:
    et
    Je vous remercie

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    oula.. c'est juste pas la même chose.

    C'est même pas les mêmes opérateurs.

    Le premier alloue un entier et lui affecte 3 et o pointera sur cet entier.
    le second alloue deux entiers (un tableau) default-initialized et o pointera sur le premier élément du tableau.

  3. #3
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par Goten
    C'est même pas les mêmes opérateurs.
    +1
    Le premier c'est l'opérateur new.
    Le deuxième c'est l'opérateur new[].

  4. #4
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    ok,merci.
    et pour ma premier question (celle avec size_t?)

  5. #5
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Citation Envoyé par deubelte Voir le message
    ok,merci.
    et pour ma premier question (celle avec size_t?)
    mais vous y avez répondu par vous même, il faut utiliser new[], ou alors je n'ai pas compris la question
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  6. #6
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    En fait, je viens de comprendre que j'avais répondu moi-même à la question.
    l'opérateur définit dans ma classe n'alloue qu'un et un seul pointeur.

    Donc, ok j'ai compris. Ensuite, j'ai effectivement essayer l'opérateur new[]:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    static void * operator new[](size_t size){
    		  return ::operator new[sizeof(X)*size]; //remarquons ici les :: pour la portée globale. 
    	  };
    mais le compilateur me renvoie comme erreur:

    "cannot determine which instance of overloaded function operator new is intended".

  7. #7
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    size représente la taille de la classe (son sizeof)

    Dans ton exemple tu lui passe la classe X qui est vide, et sa taille vaut donc 1. (j'aurais misé sur zéro mais bon )

    Si tu rajoutes une variable membre de type int à X alors size vaudra 4.

    new a besoin de cette info pour allouer la mémoire nécessaire pour contenir l'instance de l'objet. En simplifié new c'est à peu près équivalent à faire un malloc(sizeof(X)) + appeler le constructeur de X.

  8. #8
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Ben oui, ça devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    static void * operator new[](size_t size)
    {
      return ::operator new[](size);
    };
    Pour l'opérateur new[] le paramètre size représente la taille de la classe X multipliée par le nombre d'élément dans le tableau. Si X contient un unique int alors :
    appellera l'opérateur new[] avec un size valant 8.
    C'est à peu près équivalent à faire un malloc(sizeof(X) * 2) + 2 appels au constructeur de X pour les deux cases du tableau.

Discussions similaires

  1. Question sur le mot new
    Par heeedi dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 03/08/2009, 11h20
  2. Question sur l'opérateur ::
    Par johnkro dans le forum Langage
    Réponses: 8
    Dernier message: 14/03/2008, 10h13
  3. Questions sur l'opérateur <<
    Par coyotte507 dans le forum C++
    Réponses: 4
    Dernier message: 18/11/2007, 22h54
  4. Question sur String variable = new String( )
    Par beegees dans le forum Langage
    Réponses: 12
    Dernier message: 14/05/2007, 21h38
  5. question sur les opérateurs
    Par isidore dans le forum C++
    Réponses: 10
    Dernier message: 25/02/2005, 18h46

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