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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre chevronn�

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

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 chevronn�

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

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    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