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 :

Overload de delete


Sujet :

C++

  1. #1
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut Overload de delete
    Salut à tous !
    Je commence à suivre le tutoriel de Laurent Gomilla sur la réalisation d'un moteur 3D (pour voir à quoi ressemble un truc propre ), et je bute sur le premier chapitre concernant la gestion des fuites de mémoire.
    En utilisant exactement le code fournis à la fin, j'arrive à faire fonctionner new :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT)
    {
        int* p = new int;
     
        //delete p;
     
        return 0;
    }
    ... le gestionnaire de mémoire me signale bien la fuite.
    En revanche, si j'un-comment le delete, le programme crash sur le new...
    Je ne vois pas comment c'est possible. Comment une ligne peut être affectée par une autre qui est sensée s'exécuter après ?

    Voilà à quoi ressemble le delete overloadé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inline void operator delete(void* Ptr)
    {
        Yes::CMemoryManager::Instance().Free(Ptr, false);
    }
    Le pire, c'est que si je remplace le "delete p;" par "Yes::CMemoryManager::Instance().Free(p, false);" ça fonctionne !
    C'est une fonction inline, le compilateur la remplace donc par son contenu lors de la compilation, je me trompe ? Le résultat doit donc être identique. C'est insensé...

    Alors j'en viens à penser qu'il y a un problème de macro.
    Voilà celle que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define delete Yes::CMemoryManager::Instance().NextDelete(__FILE__, __LINE__), delete
    Mais le problème persiste même quand je commente cette macro (faire un "#undef delete" ne change rien non plus). Ca n'est donc pas un problème de macro ?

    Ou alors c'est du code qui fonctionne avec VC++ mais pas avec gcc ? (mais bon, ça compile...)

    (à noter : le programme fonctionne parfaitement si j'utilise le delete original)

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je pense qu'il nous faut plus d'infos.
    Le code du new, par exemple...

    Aussi, as-tu bien testé ton memory manager séparément ?
    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 éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 764
    Points
    764
    Par défaut
    Voilà le code du new :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inline void* operator new(std::size_t Size, const char* File, int Line)
    {
        return Yes::CMemoryManager::Instance().Allocate(Size, File, Line, false);
    }
    ... et la macro associée (pour ne pas avoir à se retaper les paramètres File et Line à chaque fois) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define new    new(__FILE__, __LINE__)
    L'allocation fonctionne correctement (elle se résume à un malloc(Size);) : je peux me servir de la variable créée sans problème.

    Le code fonctionne bien si j'écris ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int* p = (int*)Yes::CMemoryManager::Instance().Allocate(4, __FILE__, __LINE__, false);
     
    *p = 5;
    printf("%d", *p);
     
    Yes::CMemoryManager::Instance().Free(p, false);
    ... ce qui devrait être équivalent à utiliser les fonctions overloadées.

    Le debogage ne me donne aucune info intéressante (SEGFAULT, impossible à retracer). J'ai du utiliser des break points, et il se trouve que le programme crash bien sur la ligne du "new int", mais ne parvient jamais à l'intérieur de ma fonction overloadée.
    Le problème ne vient pas de la macro, puisque si je remplace le "new int" par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* p = new(__FILE__, __LINE__) int;
    ... ça ne change strictement rien.

Discussions similaires

  1. Delete on cascade avec SQL server
    Par fadoua dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/01/2004, 11h02
  2. fonction postgresql qui delete un enr
    Par access dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/11/2003, 14h44
  3. [requête] DELETE + SELECT
    Par doohan dans le forum Requêtes
    Réponses: 6
    Dernier message: 07/07/2003, 12h27
  4. [langage] delete de fichier
    Par lolive dans le forum Langage
    Réponses: 2
    Dernier message: 24/04/2003, 15h04
  5. Overload
    Par JMF dans le forum Langage
    Réponses: 8
    Dernier message: 18/04/2003, 09h19

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