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 :

Redéfinition de l'opérateur new


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Par défaut Redéfinition de l'opérateur new
    Bonjour,

    Je souhaiterais pouvoir interdire l'utilisation de l'opérateur new à partir d'un certain moment dans mon code. Du coup, je me dis que de le redéfinir est la solution. Mais je ne vois pas comment.

    Cordialement,

    Julien.

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2011
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2011
    Messages : 366
    Par défaut
    Citation Envoyé par Khan34 Voir le message
    Bonjour,

    Je souhaiterais pouvoir interdire l'utilisation de l'opérateur new à partir d'un certain moment dans mon code. Du coup, je me dis que de le redéfinir est la solution. Mais je ne vois pas comment.

    Cordialement,

    Julien.
    Si tu veux empêcher quelqu'un d'instancier une classe en particulier, il te suffit de déclarer les constructeurs en privé.

    Si vraiment tu veux redéfinir new, c'est possible:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class C {
    public:
    void* operator new (size_t size, autres parametres);
    }

  3. #3
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Citation Envoyé par Khan34 Voir le message
    Bonjour,

    Je souhaiterais pouvoir interdire l'utilisation de l'opérateur new à partir d'un certain moment dans mon code. Du coup, je me dis que de le redéfinir est la solution. Mais je ne vois pas comment.

    Cordialement,

    Julien.
    Qu'est-ce que tu veux dire par "a partir d'un certain moment"?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    A ta place, je passerais par une factory générique (enfin, en réalité à ta place, je réfléchirai 2 ou 3 fois de plus à savoir pourquoi je veux faire cette opération des plus étranges et voir ce qui peut être fait de bien plus belle manière à cette fin).
    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
    29
    30
    31
    32
    class Factory
    {
     template<class T>
     static bool New(T*& t) { 
      t = NULL; 
      if (canConstruct())
      {
        t = new T;
        return true;
      }
      return false;
     }
     template<class T>
     static bool NewArray(T*& t, unsigned int size) { 
      t = NULL;
      if (canConstruct())
      {
        t = new T[size];
        return true;
      }
      return false;
     }
     // return false pour interdire la construction
     static bool canConstruct() { return true; }
    };
     
    int* array;
    if (Factory::NewArray(array, 10))
    {
      // manipulation de mon array[10] correctement créé
      delete[] array;
    }
    Par contre je laisse de côté les paramètres du constructeur (sûrement très simple à ajouter en C++11, moins sans ça je trouve).
    Du coup je m'interdis aussi les déclarations sans pointeur.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Par défaut
    Merci pour vos réponses.

    Alors l'intérêt d'interdire une allocation mémoire dynamique est du au fait que l'on est dans un contexte de système embarqué. Il y a donc une étape de configuration au démarrage pendant laquelle les allocations sont autorisées, puis interdites par la suite (d'ou le "à partir d'un moment").

    Julien.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Là, c'est une autre paire de manche.
    Il s'agit d'interdire toute allocation dynamique, pas seulement celles de quelques classes.

    Le mieux, c'est de spécifier ce comportement, et de taper sur tout développeur qui ne s'y soumet pas

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 65
    Par défaut
    Oui voila, la difficulté est qu'il faut vraiment interdire tout type d'allocation dynamique. Je t'avouerai que j'avais pensé à ta solution =). Après bon effectivement sur des "petits" projets un simple mot peut suffire, mais pour de la programmation multi-sites (France, Angleterre, Chine, ...) il y aura toujours quelqu'un qui ne respectera pas cette règle

    Julien.

  8. #8
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Une spécification est un "commandement divin devant absolument être suivi sous peine de rejet du projet par le client". Spécifier, c'est donner un ordre qui ne peut pas être refusé.

    Cela dit, l'interdiction posée bloque aussi l'utilisation des string, des collections, et des lazy-singletons et j'en passe.

    Dans ce cas, tu peux tricher violemment, en imposant une redéfinition à la compilation de malloc et new via une macro. Je pense à -Dnew="null;exit(-1);//" ou -Dnew="null;throw 0;//" (ou la variante #define en forçant l'inclusion du .h le contenant par la spec)
    Mais c'est probablement trop violent.

    Mais si le problème est la taille mémoire, un gros paquets de variable aura le même effet qu'un new: l'encombrement.

    Du coup, pour quelle raison veux-tu interdire totalement l'allocation dynamique?

Discussions similaires

  1. Surcharge de l'opérateur new
    Par :Bronsky: dans le forum C++
    Réponses: 17
    Dernier message: 27/10/2010, 21h33
  2. Redéfinition opérateurs new et delete globaux
    Par bolhrak dans le forum C++
    Réponses: 8
    Dernier message: 30/07/2007, 11h34
  3. redéfinition de l'opérateur ==
    Par zackrel dans le forum C++
    Réponses: 6
    Dernier message: 24/04/2006, 20h34
  4. Redéfinition / Surdéfinition d'opérateur
    Par slate dans le forum C++
    Réponses: 12
    Dernier message: 17/02/2006, 02h17
  5. namespace et opérateur new
    Par Sylvain Rousseau dans le forum C++
    Réponses: 3
    Dernier message: 06/01/2005, 23h24

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