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

Moteurs 3D Discussion :

[Yes::Engine] Compilation et utilisation du gestionnaire de mémoire


Sujet :

Moteurs 3D

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Points : 8
    Points
    8
    Par défaut [Yes::Engine] Compilation et utilisation du gestionnaire de mémoire
    Bonjour,

    je viens de commencer le tutorial sur le Yes::Engine. Mais je n'arrive pas à utiliser les outils de debug, et plus principalement le Gestionnaire de mémoire avec Code::Blocks.

    J'ai essayé différentes façon de faire : compiler une bibliothèque statique, compiler les fichiers comme faisant partie du projet, faire hériter ou non le CMemoryManager de CSingleton. Mais ca ne marche pas, il y a plusieurs symptomes :

    1) Si je n'utilise pas la classe CSingleton, le programme segfault dès que je fais un new (ce qui est assez génant). Le fichier memory leaks.log est créé, mais il est vide (il n'y a même pas les entêtes)

    2) Si j'utilise la classe CSingleton, rien que le fait de l'inclure dans le CMemoryManager.h me sort les erreurs suivantes :
    Singleton.h L44 : Yes::CMemoryManager has not been declared
    (dans le destroy de CSingleton)

    DebugNew.h L30 : Declaration of `operator new` as non-function
    ainsi que pour la deuxième déclaration de new

    Pour les delete, j'ai l'erreur suivante :
    class `Yes::CMemoryManager::Instance` is not a type



    Voila, je ne sais plus quoi faire, ca fait deux jours que je me casse la tête à essayer de faire marcher ce gestionnaire de mémoire. Toute aide serait la bienvenue.

    Merci d'avance.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Si je me souviens bien dans le code d'init, il y a un truc qui est loggé avant même d'avoir initialisé le logger, ce qui lance une exception, elle même rattrapée par le logger qui n'existe pas, etc...

    C'est dans YesApplication si je me souvient bien.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Pareil, et j'en voit pas le bout.

    Qui plus est, le debugger integré a code::block ne m'aide pas beaucoups . . .

    EDIT : on va meme pas dans le code d'init le probleme viens bien du memory manager

  4. #4
    Invité
    Invité(e)
    Par défaut
    Oui, si je me souviens bien, c'est à cause du logger qui est fixé dès le début... tu log les execptions du memory manager, qui crashe au demarage faute de logger ou un truc dans le genre. si je me souviens bien, il remonter l'appel de creation du logger, de manière à ne plus avoir ce probleme.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    J'ai un solution.

    Le probleme viens du fait que le constructeur du memory manager fait appel a un delete, qui lui meme rapelle le memorymanager, et ce, jusqu'a ce que la pile d'appel deborde et que le systeme coupe les vivres a l'application.

    Ma solution, c'est pas nickel, mais ca marche :

    Dans memorymanager.h :

    en public :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            //----------------------------------------------------------
            // Revoie l'etat de creation du Memorymanager
            //----------------------------------------------------------
            static bool isReady();
    en privé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
           static bool ready;
    dans memory manager.cpp :

    Avant le constructeur :

    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
     
    /////////////////////////////////////////////////////////////
    /// Initialisation des membres statics
    ///
    ////////////////////////////////////////////////////////////
    bool CMemoryManager::ready = false;
     
     
    /////////////////////////////////////////////////////////////
    /// Acesseur sur ready
    ///
    ////////////////////////////////////////////////////////////
    bool CMemoryManager::isReady(){
    	return CMemoryManager::ready;
    }
    Il nous reste a adapter nos deletes, dans debuNew.h :
    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
     
    /////////////////////////////////////////////////////////////
    /// Surcharge de l'opérateur delete
    ///
    /// \param Ptr : Pointeur sur la zone à libérer
    ///
    ////////////////////////////////////////////////////////////
    inline void operator delete(void* Ptr) throw()
    {
    	if(!Yes::CMemoryManager::isReady()){
    		free(Ptr);
    		return;
    	}
        Yes::CMemoryManager::Instance().Free(Ptr, false);
    }
     
     
    /////////////////////////////////////////////////////////////
    /// Surcharge de l'opérateur delete[]
    ///
    /// \param Ptr : Pointeur sur la zone à libérer
    ///
    ////////////////////////////////////////////////////////////
    inline void operator delete[](void* Ptr) throw()
    {
    	if(!Yes::CMemoryManager::isReady()){
    		free(Ptr);
    		return;
    	}
        Yes::CMemoryManager::Instance().Free(Ptr, true);
    }
    Chez moi ca marche impec, donc je propose

  6. #6
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Merci, au vu des derniers différents tests que j'avais fait, j'avais repéré un appel récursif à delete.

    Je vais tester ta solution qui me parait prometteuse, merci beaucoup!!

    Par contre, je viens de relire ton code, a quel moment le CMemoryManager::ready est passé à true??

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    lol, effectivment, j'ai oublié un bout de code, desolé !

    le voici :

    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
    /////////////////////////////////////////////////////////////
    /// Constructeur par défaut
    ///
    ////////////////////////////////////////////////////////////
    CMemoryManager::CMemoryManager() :
    m_File("Memory leaks.log")
    {
        // On vérifie que le fichier est bien ouvert
        if (!m_File)
            throw CLoadingFailed("Memory leaks.log", "Impossible d'accéder en écriture");
     
        // Inscription de l'en-tête du fichier
        m_File << "  ========================================" << std::endl;
        m_File << "   Yes::Engine v0.1 - Memory leak tracker " << std::endl;
        m_File << "  ========================================" << std::endl << std::endl;
     
        ready = true;
    }
    Il est mis a true tout simplement quand le memory manager est pret

  8. #8
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Merci bien, je vais tester tout ca, et je te tiens au courant.

  9. #9
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    C'est bon, tout marche parfaitement, je vais pouvoir avancer.

    Merci beaucoup !!!

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Tu devrais mettre un tag resolus dans ce cas, ca aidera surrement quelqu'un d'autre de retrouver ce topic.

  11. #11
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Euh, il me semble que je l'ai mis, non??

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Yes::Engine] problème de compilation avec mingw et <cmath>
    Par jo-leptipois dans le forum Moteurs 3D
    Réponses: 1
    Dernier message: 04/09/2013, 09h06
  2. [YES::ENGINE]:problème de compilation visual c++ 2005
    Par starkyetHutch dans le forum Moteurs 3D
    Réponses: 2
    Dernier message: 01/02/2008, 18h06
  3. Réponses: 3
    Dernier message: 29/08/2006, 13h10
  4. pb de link dans Visual C++ avec yes engine
    Par Jabrul dans le forum MFC
    Réponses: 14
    Dernier message: 14/01/2006, 13h53
  5. Réponses: 11
    Dernier message: 21/09/2005, 04h56

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