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 :

c'est quoi cette erreur??


Sujet :

C++

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    Par défaut c'est quoi cette erreur??
    rebonjour, toujours dans la serie des outils, j'en suis au memory manager.

    j'ai a peu pres respecté tout ce qu'il y a ecrit ici
    http://loulou.developpez.com/tutorie...artie1/#L2.2.2
    et la --> http://www.flipcode.com/articles/article_memoryleaks.shtml

    la compilation se passe assez bien (sous linux g++ 4.0)
    mais l'execution n'est pas terriible
    voici un pitit prog test
    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
     
     
    #if _DEBUG
    #include "tools/OPNewDeleteOn.h"
    #endif
     
    struct test{
    	void print(){std::cout <<"bonjour"<<endl;}
     
    };
     
    main(){
     
     
                    cout << "Avant test* A = new test;" << endl;
    		test* A = new test;
    		cout << "Avantdelete A;" << endl;
    		delete A;			
     
     
    }
    #if _DEBUG
    #include "tools/OPNewDeleteOff.h"
    #endif
    et voivi ce qu'il me sort a l'execution


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    elekis@ubuntu:~/stuff$ ./test
    Avant test* A = new test;
    dans new
    dans Instance
    dans delete
    dans Instance
    terminate called after throwing an instance of '__gnu_cxx::recursive_init'
      what():  N9__gnu_cxx14recursive_initE
    Abandon
    les dans new, dans Instances, sont respectivement les fonctions de loulou
    http://loulou.developpez.com/tutorie...artie1/#L2.2.2

    j'ai googelisé, que dalle...
    j'aurais voulu savoir ce que veux dire cette erreur (c'est la premiere fois que je vois cette erreur la.)

    a noté que si j'enleve le delete A, tout fonctionne impect (si ce n'est que j'ai une fuite de memoire)

    et que l'erreur apres été isolé se trouve ici (enfin , je crois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CMemoryManager& CMemoryManager::Instance()
    {
        static CMemoryManager Inst;
        return Inst;
    }
    anyidea???


    merci

    a+++

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Terminate est une fonction appelée quand un truc merde dans les exceptions.

    Extrait de la norme :
    Citation Envoyé par Les saintes écritures du C++
    In the following situations exception handling must be abandoned for less subtle error handling techniques:
    — when the exception handling mechanism, after completing evaluation of the expression to be thrown but before the exception is caught (15.1), calls a user function that exits via an uncaught exception,134)
    — when the exception handling mechanism cannot find a handler for a thrown exception (15.3), or
    — when the destruction of an object during stack unwinding (15.2) exits using an exception, or
    — when construction or destruction of a nonlocal object with static storage duration exits using an exception (3.6.2), or
    — when execution of a function registered with atexit exits using an exception (18.3), or
    — when a throwexpression with no operand attempts to rethrow an exception and no exception is being handled (15.1), or
    — when unexpected throws an exception which is not allowed by the previously violated exceptionspecification, and std::bad_exception is not included in that exceptionspecification (15.5.2), or
    — when the implementation’s default unexpected_handler is called (18.6.2.2)
    In such cases, void terminate(); is called (18.6.3).
    Sans voir le code de OPNewDeleteOn.h et du cpp associé, j'ai du mal à aider plus. Ma devinette à 2 balles d'après le nom recursive_init est que le constructeur de CMemoryManager fait appel à la fonction Instance.[/quote]
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    Par défaut
    voici mon constructeur (enfin mon???)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CMemoryManager::CMemoryManager():m_File("Memory leaks.log"){
    	cout << "dans CMemoryManager" << endl;
      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 << "  Memory leak tracker" << std::endl;
        m_File << "  ========================================" << std::endl << std::endl;
     }
    m_file est de type std::ofstream m_File; // Fichier de sortie (c''est un simple fichier et non une clase CFile car je n'ai pas encore pu regarder la classe Cfile (et j'aime mieux construire pierre apers pierre , plus tot que de tout claché et d'essayer de voir comment a quoi ca ressemble)



    voici new et delete


    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
     
     
     
     
    inline void operator delete(void* Ptr)
    {
    	cout << "dans delete" << endl;
    	CMemoryManager::Instance().Free(Ptr);    
     
    }
     
     
     
    inline void* operator new(std::size_t Size, const char* File, int Line)
    {
    	cout << "dans new" << endl;
     
     
        return CMemoryManager::Instance().Allocate(Size, File, Line);
    }
    tiens au fait, la norme, elle se trouve sur internet???


    a+++

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Indice : "dans CMemoryManager" ne s'affiche pas. On ne va donc pas loin dans le constructeur...

    Mon hypothèse est la suivante :
    Tu fait appel à CMemoryManager::Instance.
    Pour ça, tu as besoin d'initialiser la variable statique Inst
    Tu passe donc dans le constructeur de CMemoryManager
    Le constructeur initialise la variable m_File.
    Cette initialisation a besoin de mémoire dynamique quelquepart. (c'est là mon hypothèse à valider)
    Donc elle appelle l'opérateur new global que tu as surchargé.
    Cet opérateur a besoin de CMemoryManager::Instance
    Celui ci n'a pas encore fini de construire la variable statique, le compilo est assez malin pour se rendre compte qu'il y a une couille dans le potage, donc boom.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par elekis
    tiens au fait, la norme, elle se trouve sur internet???
    Oui, mais elle est payante ($18 en pdf, beaucoup plus en version papier).
    http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FISO%2FIEC+14882%2D2003

    Des versions brouillon de la norme, mais pas forcément trop différentes, traînent ici ou là. Les mots clef "c++ standard december 1996" dans google te donnent des liens, qui permettent entre autre de te familiariser avec le style d'écriture d'une norme.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre habitué

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Points : 189
    Points
    189
    Par défaut
    bon je ne sais pas pouruoi, mais j'ai reecris la classe (plus ou moins ) et mnt, ca fonctionne. mais mais aucune idée du pouruqoi du comment. on verra si ca reviendra plus tard.


    merci

    a+++

Discussions similaires

  1. C'est quoi cette erreur
    Par okoweb dans le forum Langage
    Réponses: 2
    Dernier message: 02/12/2010, 11h49
  2. [Boost Graph] c'est quoi cette erreur?
    Par nina2007 dans le forum Boost
    Réponses: 2
    Dernier message: 14/10/2009, 15h49
  3. Réponses: 15
    Dernier message: 08/03/2009, 14h37
  4. C'est quoi cette erreur ?
    Par 19cmos83 dans le forum Struts 1
    Réponses: 6
    Dernier message: 09/05/2008, 17h26
  5. c'est quoi cette erreur ?
    Par guitariste dans le forum C++
    Réponses: 4
    Dernier message: 26/12/2007, 20h42

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