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 tutoriel alloc sécurisée et opérateur new


Sujet :

C++

  1. #1
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut Question tutoriel alloc sécurisée et opérateur new
    Bonsoir tout le monde !
    J'ai lu avec beaucoup d'intérêt le tutoriel sur l'allocation sécurisée de mémoire :
    http://haypo.developpez.com/article/halloc/

    J'ai notamment été surpris de voir avec quelle facilité on peut redéfinir l'opérateur new :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #undef new
    #undef delete
     
    ...
     
    // Surchage de l'opérateur new
    void* operator new (size_t size, const char* nom, const unsigned long ligne)
      throw (std::bad_alloc)
    {
      return MallocSecurise (size, nom, ligne);
    }
    Ma question est la suivante :
    j'aimerais utiliser les new de mon programme actuel, mais les encadrer par du code de calcul de temps (une sorte de profiling inline).
    J'ai bien sûr pensé à tous les changer, mais vu la quantité, j'en ai pour deux semaines .
    Du coup, est-il possible de s'inspirer de la méthode précédente pour que, lors d'un appel à new dans le code, il remplace ce new par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //un bout de code
    start();
    //Allocation mémoire
    my_ptr = new byte[3];
     
    // un autre bout de code
    stop()
    Merci d'avance !

  2. #2
    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
    Pas vraiment.
    Tu peux cependant transformer ça en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_ptr = new(prof) byte[3];
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct prof_t
    {
    }:
     
    extern prof_t prof;
     
    void* operator new(size_t size, prof_t)
    {
       start();
       void* p = ::operator new(size);
       stop();
       return p;
    }

  3. #3
    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
    Ne pas oublier de surcharger new [] pour l'allocation de tableaux.

  4. #4
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Ca signifie que je suis obligé de modifier tous les appels à new (et new[] effectivement) pour adapter le code...
    Pas moyen de le faire en surchargeant new (et new[] ), et en disant que c'est cette surcharge "maison" qu'il faut utiliser ?

  5. #5
    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
    Pas moyen de le faire en surchargeant new (et new[] ), et en disant que c'est cette surcharge "maison" qu'il faut utiliser ?
    Normalement si, mais puisque loufoque a suggéré le contraire il y a peut-être une bonne raison de ne pas le faire.

  6. #6
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    OK, laquelle est-ce ?
    Comment faire si je veux quand même le faire ?

  7. #7
    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
    Bah après tu fais
    #define new new(prof)

    Ou truc du style, comme pour ton autre système...

  8. #8
    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
    Citation Envoyé par loufoque
    Bah après tu fais
    #define new new(prof)

    Ou truc du style, comme pour ton autre système...
    En pratique ça marchera, mais en théorie c'est interdit.
    Pourquoi ne pas surcharger directement la version de new sans paramètre supplémentaire ?

  9. #9
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Tu veux dire que je surcharge sans rien ajouter en terme de paramètres, et le compilateur saura que c'est ma version qu'il doit utiliser ?

  10. #10
    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
    Citation Envoyé par progfou
    Tu veux dire que je surcharge sans rien ajouter en terme de paramètres, et le compilateur saura que c'est ma version qu'il doit utiliser ?
    En théorie oui.

  11. #11
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void* operator new (size_t size) 
    {
      //un bout de code
      start();
      //Allocation mémoire
      //Comment faire ici ?
     
      // un autre bout de code
      stop()
    };
    ?

    Si oui, comment faire le new (je me débrouillerais pour le new[]) ?

  12. #12
    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
    Tu peux faire un malloc(size) pour allouer la mémoire (n'oublie pas de surcharger delete pour utiliser free). Ou encore taper directement dans les fonctions d'allocation de ton OS.

  13. #13
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    J'ai tenté ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void* operator new (size_t size) 
    {
    	void *p = malloc(size);
    	return p;
    };
     
    void operator delete (void * p)
    {
    	free(p);
    };
    Et j'obtiens des warning :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    warning LNK4006: "void * __cdecl ma_classe::operator new(unsigned int)" (**************) already defined in truc.obj; second definition ignored
    Il ne faut pas #undef, si je surcharge, pourtant...
    Et même en le mettant, j'ai les même erreurs.

  14. #14
    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
    Pourquoi est-ce que le compilo parle de l'opérateur new de ma_classe ?
    Tu peux nous montrer un code minimal complet qui résume ce que tu fais ?

  15. #15
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Code minimal, difficilement, mais par contre, je vois que l'opérateur a été redéfini !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       Void *operator new( size_t stAllocateBlock, Void* pv )
       {
         return ( NULL == pv ) ? (::operator new( stAllocateBlock )) : pv;
       }
    Dans ma_classe, ce qui explique pourquoi il crie...

    En clair, ça signifie que c'est là que je dois redéfinir ?

  16. #16
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    Bon j'ai compris pourquoi, problème réglé.

    Comment redéfinir new[] maintenant ?
    Je ne saisi pas bien dans ce cas là, car autant new c'est assez évident, autant new[]...

  17. #17
    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
    C'est pareil, sauf que l'opérateur s'appelle new[]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void* operator new[](std::size_t Size);

  18. #18
    Membre éprouvé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Par défaut
    J'ai finalement une autre erreur, il me dit (Visual Studio 2005) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void __cdecl operator delete[](void *)" ... already defined in coredll.lib(COREDLL.dll)
    J'ai pourtant spécifié au linker de ne pas utiliser coredll.lib !

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. question sur l'opérateur new
    Par deubelte dans le forum Débuter
    Réponses: 54
    Dernier message: 29/03/2010, 10h47
  3. Redéfinition opérateurs new et delete globaux
    Par bolhrak dans le forum C++
    Réponses: 8
    Dernier message: 30/07/2007, 11h34
  4. Différence opérateur new et constructeur
    Par Burckel dans le forum C++
    Réponses: 7
    Dernier message: 16/11/2006, 10h21
  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