An die Profis -> DEBUG: delete []



  • Ich lade mit einer Elementfunktion einer Klasse Informationen aus einer Datei.

    Vereinfacht dargestelltes Dateiformat:

    NumBlocks
    Block[NumBlocks]
    {
    NumData
    Data[NumData]
    }

    Anders ausgedrückt: Eine variable Anzahl von unterschiedlich großen Datenblöcken.

    Um das zu realisieren, habe ich eine verschachtelte Schleife. Die äußere zählt NumBlocks hoch, die innere zählt NumData hoch.

    In der äußeren Schleife fordere ich noch vor der inneren Schleife mit new temporären Speicher an und lösche ihn nach der inneren Schleife mit delete []:

    for(ÄUßERE)
    {
    pTemp = new Typ[Anzahl]

    for(INNERE)
    {
    }

    delete [] pTemp
    }

    Der Speicher wird korrekt angelegt, korrekt mit Daten gefüllt und es wird korrekt auf Daten zugegriffen. Alles funktioniert so wie es sein sollte.

    Doch nun kommt delete []:

    Ich kann schon im ersten Schleifendurchlauf den Speicher nicht freigeben. Hier eine History über den Ablauf (pUseData ist - so wie es sein muss - die korrekte Adresse meines angeforderten Speichers):

    DEBUG.PDF

    Besonders aufmerksam machten mich in der Debugausgabe die Heap-Fehler schon vor Beginn meines eigentlichen Programmes zwischen den Ladevorgängen der Dlls (siehe PDF, Seite 2, unten)!



  • Ausser das Du memoryleaks | überschrieben Arraygrenzen | sontige Fehler hast kann man Deinem Beitrag nicht entnehmen.

    for(ÄUßERE) 
    { 
    pTemp = new Typ[Anzahl] 
    
    for(INNERE) 
    { 
    } 
    
    delete [] pTemp 
    }
    

    ist ok wenn garantiert ist das pTemp bei delete das pTemp ist was es bei new war. (Also ohne pTemp = x zu schreiben) und die Grenzen des Speichers beachtet werden.



  • Wie ich bereits oben geschrieben habe wird garantiert alles korrekt verwendet: Keine Arraygrenzenüberschreitung, es ist das selbe pTemp (wie gesagt, gleiche Adresse im Speicher).



  • Wie kann es denn sein, dass schon VOR meinem Code Heap-Fehler auftauchen?



  • Die Memory-Leaks am Ende des Programms kommen IMHO wegen dem DEMAGE bei (4) zustande.



  • Du widersprichst dir ja selber:

    Unknown GER schrieb:

    Wie ich bereits oben geschrieben habe wird garantiert alles korrekt verwendet: Keine Arraygrenzenüberschreitung, es ist das selbe pTemp (wie gesagt, gleiche Adresse im Speicher).

    Die Memory-Leaks am Ende des Programms kommen IMHO wegen dem DEMAGE bei (4) zustande.

    Wie schon gesagt wurde. DAMAGE gibts nur, wenn du irgendwo rein schreibst wo du nix allokiert hast.

    Ohne präziseren Code gibt das nix.

    -junix



  • Genau das ist mein Problem, ich habe das mit cout genau verfolgt, dass niergends ein Bereich überschritten wird. Ganz vereinfach könnte man schreiben:

    int *pData = new int[3];
    pData[0] = 1;
    pData[1] = 2;
    pData[2] = 3;
    delete [] pData;

    Deshalb nochmal: ES GIBT SCHON VOR MEINEM EIGENTLICHEN PROGRAMM HEAP-FEHLER (zwischen den Dll-Ladevorgängen).



  • Na das is doch dann einfach.

    Der Code vor Deinem wird fehlerhaft sein.
    Nur wie wir Dir nun helfen können.... ka

    Kristallkugel ausser betrieb.



  • Vielleicht ein Fehler in dem Konstruktor einer globalen Variable?


Anmelden zum Antworten