std::vector & Heap Probleme

  • Hallo Leute..
    Hab wieder mal ein Problem: Also ich hab eine Klasse und die Methode 'createNewNode()', die mir einen Pointer auf ein 'vector<Vec3>' haelt, wobei 'Vec3' eine Klasse ist, die mir einen 3-dimensionalen Vektor repraesentiert. Diese Methode und 'createSubTree()' zusammen entspraechen einem Rekursiven Methodenaufruf. Hier mal die wichtigsten Code-Stuecke:


    Der Compiler bemaengelt nichts und kompiliert ohne Warnings. Zur Laufzeit bekomme ich nach einer Weile die Fehlermeldung: 'Unhandled exception at 0x778813b1 in MyApp.exe: User breakpoint.'. Der Call Stack gibt Folgendes aus:

    Code
    MyApp.exe!_CrtIsValidHeapPointer(const void * pUserData=0x022610f8)  Line 1807	C
    MyApp.exe!_free_dbg_lk(void * pUserData=0x022610f8, int nBlockUse=1)  Line 1132 + 0x9	C
    MyApp.exe!_free_dbg(void * pUserData=0x022610f8, int nBlockUse=1)  Line 1070 + 0xd	C
    MyApp.exe!operator delete(void * p=0x022610f8)  Line 369 + 0xb	C++
    MyApp.exe!std::allocator<SomeLib::Vec3>::deallocate(SomeLib::Vec3 * _Ptr=0x022610f8, unsigned int __formal=402)  Line 132 + 0x9	C++
    MyApp.exe!std::vector<SomeLib::Vec3,std::allocator<SomeLib::Vec3> >::_Tidy()  Line 797	C++
    MyApp.exe!std::vector<SomeLib::Vec3,std::allocator<SomeLib::Vec3> >::clear()  Line 745	C++
    MyApp.exe!createNewNode(std::vector<SomeLib::Vec3,std::allocator<SomeLib::Vec3> > * vertices=0x0012f340)  Line 334	C++


    Tja, ich bin mit meiner Weissheit am Ende.. Ich weiss nur, dass die Methode '_CrtIsValidHeapPointer()' ueberprueft, ob der Pointer (in diesem Fall, wohl der Pointer auf das array 'node_vertices') im lokalen Heap liegt oder nicht. Anscheinend ist das nicht der Fall.. Wieso eigentlich nicht? Hat jemand einen Rat wo der Fehler sein koennte?

    Dank im Voraus fuer jeden Hint..
    ciao..

  • Zitat von Zentor

    Danke fuer den Link.. er erklaert die Problematik recht gut und ich bin um einiges schlauer (:-)) aber ich weiss net ganz genau, wie ich das auf mein Problem abbilden soll.. :-/ Hast du (oder wer andere(r)) Erfahrung mit Debugging Tools (insbesondere fuer Memory-Probleme)? Falls, doch, kannst vielleicht ein paar emfehlen (wenn moeglich Open Source und fuer Win)?

    Danke nochmals..
    ciao..

  • so, ein paar dinge:

    erstens machts für mich keinen sinn diesen vector mit new anzulegen.
    ein einfaches

    vector<Vec3> node_vertices;

    sollte genügen.

    zum zweiten, der Fehler liegt eindeutig hier:

    (*node_vertices)[index] = (*vertices)[ivert];
    ++index;

    Die Debug-Ausgabe sagt, dass du über den reservierten heap-Bereich hinausgeschrieben hast, in diesem fall, weil index bei der Zuweisung einmal zu hoch war.

    Ich weiß nicht, was die schleife genau tut, so wie sie da steht, solltest du erstens das "resize" davor weglassen und den vector mit

    node_vertices.push_back((*vertices)[ivert]);

    anstatt mit der obigen Zuweisung befüllen, dann kann der index auch nicht mehr falsch sein. Ansonsten ist die Verwendung der Funktion vectorxy.at(vector-index) anstatt vectorxy[vector-index] empfehlenswert, die genau das gleiche wie der operator [] tut, nur eine exception wirft, wenn der index out of range ist.

    lg,

    stefan slapeta

  • Ast rein.. das haut hin. Hatte es vor ein paar Tagen auch mit der Stack-Variante probiert, allerdings, hatte ich '[]' dem '.at()' vorgezogen. Auf jeden Fall danke schoen!!

    ciao..

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!