1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

std::vector & Heap Probleme

  • \LaTeX
  • 3. April 2005 um 22:39
  • Unerledigt
  • \LaTeX
    7
    \LaTeX
    Mitglied
    Punkte
    425
    Beiträge
    66
    • 3. April 2005 um 22:39
    • #1

    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:

    Code
    void BlaBla::createNewNode(vector<Vec3> *vertices, ...)
    {
      if (...)
      {
        vector<Vec3> *node_vertices = new vector<Vec3>;
        node_vertices->resize(...);
        unsigned int index = 0;
        for (unsigned int ivert=0; ivert<num_vertices; ivert++)
        {
          if (...)
          {
            (*node_vertices)[index] = (*vertices)[ivert];
            ++index;
          }
        }
        ...
        createSubTree(my_array);
        ...
        node_vertices->clear();
        delete node_vertices;
      }
    }
    
    
    ...
    void BlaBla::createSubTree(vector<Vec3> *array)
    {
      ...
      // Werte von array werden veraendert/bearbeitet
      createNewNode(array);
      ...
    }
    Alles anzeigen


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

  • Zentor
    16
    Zentor
    Mitglied
    Reaktionen
    5
    Punkte
    2.710
    Beiträge
    506
    • 4. April 2005 um 07:24
    • #2

    Vielleicht hilft
    http://www.codecomments.com/archive370-2005-3-431069.html
    mfg Oliver

  • \LaTeX
    7
    \LaTeX
    Mitglied
    Punkte
    425
    Beiträge
    66
    • 4. April 2005 um 21:13
    • #3
    Zitat von Zentor

    Vielleicht hilft
    http://www.codecomments.com/archive370-2005-3-431069.html
    mfg Oliver

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

  • slapi
    3
    slapi
    Mitglied
    Reaktionen
    1
    Punkte
    56
    Beiträge
    8
    • 6. April 2005 um 15:30
    • #4

    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

  • \LaTeX
    7
    \LaTeX
    Mitglied
    Punkte
    425
    Beiträge
    66
    • 6. April 2005 um 19:40
    • #5
    Zitat von slapi

    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.

    Alles anzeigen

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

  • Maximilian Rupp 27. Dezember 2024 um 12:06

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung