HEAP - Fehler.



  • Hallo,

    ich bekomme eine unbehandelte Ausnahme mit folgender Fehlerausgabe:
    HEAP[UWSimulator.exe]: Heap missing last entry in committed range near 5330a8
    Und zwar passiert das dann, wenn ich ein std::valarray erstellen will, dass ca. 20000 Felder hat (mit 2000 funktioniert es).

    Hatte einer von Euch so ne Fehlermeldung schon mal? Woran lag es?
    Liegt es daran, dass der HEAP fehlerhaft ist? Wenn ja, wie kann es dazu kommen?

    Gruß und danke,
    Amalthea



  • Amalthea schrieb:

    Und zwar passiert das dann, wenn ich ein std::valarray erstellen will, dass ca. 20000 Felder hat (mit 2000 funktioniert es).

    zeig doch mal den source code...



  • ich prophezeie mal, dass 20000 für den heap einfach zu groß sind. ist aber nur ne vermutung.



  • ich denke eher daran, dass ein array überschrieben wurde.. also die grenzen nicht korrekt abgesteckt sind.

    bitte mal haltepunkt setzen und schritt für schritt debuggen.



  • Lars Hupel schrieb:

    ich prophezeie mal, dass 20000 für den heap einfach zu groß sind. ist aber nur ne vermutung.

    Kann nicht sein, da ich an anderer Stelle eines mit 100000 Feldern erstellen kann, ohne dass das Programm abstürzt.

    Gruß,
    Amalthea



  • Amalthea schrieb:

    Kann nicht sein, da ich an anderer Stelle eines mit 100000 Feldern erstellen kann, ohne dass das Programm abstürzt.

    dann mach das mal kleiner 😉
    pro prozess gibt's (per default, unter windoof) nur einen heap. den müssen sich alle 'new's' und 'malloc's' teilen.



  • was sagt der schritt für schritt debug?
    😉



  • elise schrieb:

    was sagt der schritt für schritt debug?
    😉

    Lass sie doch erstmal nach unwahrscheinlichen Fehlern suchen 😉
    Dann muss man sich auch nicht eingestehen, dass man selbst einen Fehler gemacht haben könnte...



  • also ich kann das nicht kleiner machen, da das so groß sein muss.

    hab jetzt rational purify installiert....

    Das meldet "freeing mismatched memory in delete(void *).

    Und zwar tritt das auf, wenn ich std::vector.reserve( 6 ) mache.

    Muss ich diesen Vektor dann explizit wieder löschen?

    PS: natürlich liegt der Fehler an mir, an wem sonst? 😉



  • Hallo,
    zeig uns doch mal den Zugriff auf den Vektor.

    Und zwar tritt das auf, wenn ich std::vector.reserve( 6 ) mache.

    Muss ich diesen Vektor dann explizit wieder löschen?

    Nein. Natürlich nicht. Aber bist du z.B. sicher, dass du die Auswirkungen von reserve richtig verstehst und diese z.B. nicht mit denen von resize verwechselst?



  • //typedef findet im Header von dcEnvironment statt
    typedef std::vector< dcPlane* > dyVecPlanes;
    
    //dann in der main wird ein vektor erzeugt und über den constructor in einer member variable von dcEnvironment gespeichert (übergabe erfolgt als referenz)
    dcEnvironment::dyVecPlanes dyvpPlanes;
    dyvpPlanes.reserve( 6 );
    dyvpPlanes.push_back( &plane1 );
    

    rational purify gibt die Fehlermeldung auch dann schon aus, wenn mit dem vector weiter gar nix passiert... also kein zugriff auf den vektor stattfindet.

    Ich denke schon, dass ich weiß, was "reserve" bewirkt. Ich frage mich halt nur, warum rational ne fehlermeldung ausgibt...



  • Also, ich denke, dass ich den Fehler gefunden habe. Ich verwende eine Klasse für die Fast Fourier Transformation. In dieser Klasse wird ein Array erstellt... und es scheint so, als würde über die Grenzen dieses Arrays hinausgearbeitet.
    (wenn ich diese Funktion nämlich auskommentiere, läuft das programm ohne heap-Fehler durch).

    Kennt jemand noch ne andere Klasse / Quelle / Source Code für die Fast Fourier Transformation?

    Danke und Gruß,
    Amalthea


Anmelden zum Antworten