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

SL & STL C++ Discussion :

std::bad_alloc :'(


Sujet :

SL & STL C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut std::bad_alloc :'(
    Bonjour à tous,

    J'instiancie une structure. Ca passe une fois, et à la deuxième, ça plante...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Unhandled exception at 0x7c81eb33 in Battle Kart.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012f2f4..
    Est-ce que ça pourrait provenir de la stdport 5.0? J'ai pas testé sans...

    Merci,

    A bientôt

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Si tu pouvais expliciter un peu...

  3. #3
    Invité
    Invité(e)
    Par défaut Re: std::bad_alloc :'(
    Citation Envoyé par mister3957
    Est-ce que ça pourrait provenir de la stdport 5.0? J'ai pas testé sans...
    stlport?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Alors en gros j'ai ça:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    struct MaStructure
    {
         float a1, b1, c1, d1;
         float a2, b2, c2, d2;
         float a3, b3, c3, d3;
         float a4, b4, c4, d4;
         float a5;
    };
     
    class class1
    {
         public:
             class1();
             ~class1();
     
         private:
             MaStructure* m_maStructure;
    };
     
    class1::class1()
    {
         m_maStructure = new MaStructure();
    };
     
    class1::~class1()
    {
         delete m_maStructure;
    };
     
    class cPrincipale
    {
         public:
              //constructeur
              // destructeur
         private:
             std::vector<class1*> m_vector;
             void uneFonction();
    };
     
    cPrincipale::uneFonction()
    {
          class1* c = new class1();
          m_vector.push_back(c);
    }
    Voilà, en résumé, j'ai un truc similaire à ça. Donc au premier appel de "uneFontion" ça passe bien, au seconde ça me fait une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Unhandled exception at 0x7c81eb33 in Battle Kart.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0012f4bc..
    en s'arrêtant là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
            {       // try to allocate size bytes
            void *p;
            while ((p = malloc(size)) == 0)
                    if (_callnewh(size) == 0)
                    {       // report no memory
                    static const std::bad_alloc nomem;
                    _RAISE(nomem);
                    }
     
            return (p);
            }
    J'ai remarqué que la première fois que class1 est instanciée, ça ne rentre pas dans le while. Alors qu'à la suivante, ça y rentre et ça plante.

    J'ai d'abord pensé que c'était la stlport (librairie standart) mais nan c'est pas ça.

    j'ai essayé également:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    class1* c = NULL;
    c = new class1();
    et c'est toujours pareil, par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class1* c = NULL;
    ZeroMemory(&c, sizeof(class1));
    c = new class1();
    avec ça ça passe, mais ça me refait la même erreur plus tard dans le code. Donc j'en rajoute encore un et ça le refait à une autre instanciation etc... Je vais quand même pas faire des ZeroMemory() à chaque fois que je construit un objet, si?

    Et pourquoi il n'arrive pas à faire de malloc(size) la deuxième fois?

    Merci

    A bientôt

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Punaise, c'est sale...
    Donne nous plus d'infos sur la pile lors de l'arrêt du programme, on se doute que c'est dans un new, mais à quel niveau ?

    Bon, ensuite, pour corriger : on fait un new class1 et non un new class1() car class1() peut être considéré comme une déclaration de fonction, et non de variable.
    Ensuite, ne fais JAMAIS ce que tu as écrit comme dernier exemple. Ca sent la personne qui essaie sans savoir ce qu'elle fait. Regarde bien ce que tu as écrit. Tu prends un pointeur nul, et tu écris des zéros à cet endroit. Mais attends, c'est où cet endroit ?? C'est à l'adresse 0x00000000, là où tu as les vecteurs d'interruption, ... tout ce qui permet à ton système de fonctionner. En gros, tu le fous en l'air. En plus, tu fais un new dessus par la suite, les 2 premières lignes sont donc clairement inutiles.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Heu ouais exact, c'est complètement débile mais bon, ne sachant que faire, j'ai mal recopié un exemple sur le net... M'enfin, ça résoud rien quand même.

    Ce soir je vais essayer de recopier des infos sur la pile (là je suis au travail j'ai pas mon projet ici).

    Je vais également essayer de le compiler sous dev-c++, juste pour voire.

    Merci

    A bientôt

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu as enlevé les parathèses que je t'ai indiqué ? Ca peut jouer - peut-être -

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Bah je suis pas chez moi, je suis au travail, mais j'essaye ça dès que je rentre, j'espère ce midi.

    Je te tiens au courant tout à l'heure, et je te remercie beaucoup

    A bientôt

  9. #9
    Membre averti
    Inscrit en
    Mars 2006
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Par défaut
    Il y a une erreur dans ta declaration
    cPrincipale::uneFonction()
    {
    ....
    }
    il manque void cPrincipale::uneFonction(){ ...}

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Effectivement... Tu as dû avoir une liste de warning, pense à les éliminer d'abord.

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Citation Envoyé par Miles
    Ensuite, ne fais JAMAIS ce que tu as écrit comme dernier exemple. Ca sent la personne qui essaie sans savoir ce qu'elle fait. Regarde bien ce que tu as écrit. Tu prends un pointeur nul, et tu écris des zéros à cet endroit. Mais attends, c'est où cet endroit ?? C'est à l'adresse 0x00000000, là où tu as les vecteurs d'interruption, ... tout ce qui permet à ton système de fonctionner. En gros, tu le fous en l'air. En plus, tu fais un new dessus par la suite, les 2 premières lignes sont donc clairement inutiles.
    Pas exactement, en fait, il transforme son pointeur NULL en pointeur égal à 0x00000000 au niveau binaire (ce qui selon l'architecture, peut être différent) et évidemment, il déborde derrière.
    Mais c'est à ne pas faire aussi.
    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.

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Oui, effectivement, il y a des cas particuliers, mais ça marche comme ça au moins sur l'archi x86, non ? - çà moins que je confonde avec 68k;.. -

  13. #13
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    Il serait intéressant d'apprendre les bases du C++ et de la programmation et surtout la gestion mémoire.

    Recopier un code sans le comprendre NE SERT à RIEN.

    concernant le std::bad_alloc, tu peux regarder le contenu de la méthode what(), qui te dira quel est le problème.

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    ben d'habitude j'essaye de comprendre, et j'y arrive, mais là comme ça me soulait ce problème, j'ai été cherché des bouts de codes à droite à gauche, j'ai recopié pour voir pi voilà. Ca reste rare, et une fois qu'en faisant comme ça ça fonction, alors je me penche dessus pour comprendre au final ce que j'ai fait, et pour pouvoir nettoyer et optimiser par la suite.

    Mais je l'accorde, c'est pas bien.

    J'ai pas pu rentrer chez moi ce midi, mais ce soir je vais faire cette méthode what() (jamais entendu parler) et j'vais recopier un peu la pile plus en profondeur en espérant que ça vous sera utile pour m'aider

    A bientôt

  15. #15
    Membre émérite
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Par défaut
    si Visual C++ utilise les specs de la STL , tu as une méthode what dans toutes exceptions du namespace std.

    std::bad_alloc contient la méthode const char * what() throw();

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    Ok, merci beaucoup, j'regarde ça ce soir et je vous dit quoi

    A ce soir

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    alors,

    ça me renvoi une bad_alloc. Sa description est... "bad allocation". J'ai cherché des infos sur google, la cause principale du déclenchement de cette exception est un lorsque l'on essaye d'alouer trop de mémoire et qu'on en a pas assez... Dans mon cas, je fais rien d'extra ordinaire, et ce que j'essaye d'instancier c'est la structure D3DMATERIAL9:

    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
     
    typedef struct _D3DMATERIAL9 {
        D3DCOLORVALUE   Diffuse;        /* Diffuse color RGBA */
        D3DCOLORVALUE   Ambient;        /* Ambient color RGB */
        D3DCOLORVALUE   Specular;       /* Specular 'shininess' */
        D3DCOLORVALUE   Emissive;       /* Emissive color RGB */
        float           Power;          /* Sharpness if specular highlight */
    } D3DMATERIAL9;
     
    typedef struct _D3DCOLORVALUE {
        float r;
        float g;
        float b;
        float a;
    } D3DCOLORVALUE;
    Sinon je vais recopier un peu la pile des appels jusqu'à l'erreur:


    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    m_dxMaterial = new D3DMATERIAL9(); <--
     
    ---------------------------------------------
     
    void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
            {       // try to allocate size bytes
            void *p;
            while ((p = malloc(size)) == 0) <--
                    if (_callnewh(size) == 0)
                    {       // report no memory
                    static const std::bad_alloc nomem;
                    _RAISE(nomem);
                    }
     
            return (p);
            }
     
    ----------------------------------------------
     
    extern "C" _CRTIMP void * __cdecl malloc (
            size_t nSize
            )
    {
            void *res = _nh_malloc_dbg(nSize, _newmode, _NORMAL_BLOCK, NULL, 0); <--
     
            RTCCALLBACK(_RTC_Allocate_hook, (res, nSize, 0));
     
            return res;
    }
     
    --------------------------------------------------
     
    extern "C" void * __cdecl _nh_malloc_dbg (
            size_t nSize,
            int nhFlag,
            int nBlockUse,
            const char * szFileName,
            int nLine
            )
    {
            void * pvBlk;
     
            for (;;)
            {
                /* do the allocation
                 */
                pvBlk = _heap_alloc_dbg(nSize, nBlockUse, szFileName, nLine); <--
     
                if (pvBlk)
                {
                    return pvBlk;
                }
                if (nhFlag == 0)
                {
                    errno = ENOMEM;
                    return pvBlk;
                }
     
                /* call installed new handler */
                if (!_callnewh(nSize))
                {
                    errno = ENOMEM;
                    return NULL;
                }
     
                /* new handler was successful -- try to allocate again */
            }
    }
     
    -------------------------------------------------------------------------
     
    // après on passe dans une grande fonction ou il fait plusieurs tests.
    // Puis il récupère la taille de l'objet:
    blockSize = _ROUND2(blockSize, _GRANULARITY);
    // et il l'envoi à
    pHead = (_CrtMemBlockHeader *)_heap_alloc_base(blockSize);
     
    --------------------------------------------------------------------------
     
    __forceinline void * __cdecl _heap_alloc (size_t size)
     
    {
    #ifndef _WIN64
        void *pvReturn;
    #endif  /* _WIN64 */
     
        if (_crtheap == 0) {
            _FF_MSGBANNER();    /* write run-time error banner */
            _NMSG_WRITE(_RT_CRT_NOTINIT);  /* write message */
            __crtExitProcess(255);  /* normally _exit(255) */
        }
     
    #ifdef _WIN64
        return HeapAlloc(_crtheap, 0, size ? size : 1);
    #else  /* _WIN64 */
        if (__active_heap == __SYSTEM_HEAP) {
            return HeapAlloc(_crtheap, 0, size ? size : 1); <--
        } else
        if ( __active_heap == __V6_HEAP ) {
            if (pvReturn = V6_HeapAlloc(size)) {
                return pvReturn;
            }
        }
    #ifdef CRTDLL
        else if ( __active_heap == __V5_HEAP )
        {
            if (pvReturn = V5_HeapAlloc(size)) {
                return pvReturn;
            }
        }
    #endif  /* CRTDLL */
     
        if (size == 0)
            size = 1;
     
        size = (size + BYTES_PER_PARA - 1) & ~(BYTES_PER_PARA - 1);
     
        return HeapAlloc(_crtheap, 0, size);
     
    #endif  /* _WIN64 */
    }
     
    et HeapAlloc(_crtheap, 0, size ? size : 1); a renvoyé NULL. à partir de là ça remonte jusqu'à ma ligne "new" avec l'exception...
    Je pense que je vais désormais éviter les pointeurs :s

    Miles: j'ai essayé new D3DMATERIAL9 (sans les parenthèses) et ça ne change rien

    A bientôt

  18. #18
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Efface une fois tous les fichiers .o et recommence la compilation, parce que c'est louche cette histoire...

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 825
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 825
    Par défaut
    j'ai effacé tout les .obj (en espérant que c'est les .o dont tu parlais) et j'ai fait un rebuild all.

    Rien y fait, c'est pareil

    Entre temps, j'ai remplacé le D3DMATERIAL9* par un D3DMATERIAL9, et là il me balance la même exception sur un tableau: VERTEX* tabVertex = new VERTEX[nbVertex]; VERTEX étant une structure de 5 float.

    et si on essaye de le recompiler sur une autre machine, ça peut être un test intéressant? Si oui, ben j'peux transmettre mes sources...

    J'ai essayé DEV-C++... ça me semble assez galère d'y faire le portage, j'ai pas cherché longtemps

  20. #20
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu as l'air d'avoir un autre souci, je ne sais pas. Tu utilises des bibliothèques avec ton code ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 14/02/2012, 10h39
  2. Réponses: 7
    Dernier message: 18/11/2008, 09h12
  3. std::bad_alloc Exception projet VCL
    Par mickyoun dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/10/2007, 17h48
  4. [debutant c++] std::bad_alloc
    Par Gotmere dans le forum SL & STL
    Réponses: 2
    Dernier message: 28/05/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