delete von 2D array



  • Hallo zusammen,

    ich weiß nicht wie ich korrekt den Speicher wieder freigeben muss

    int **xArray = new int*[x.size()+1];
    for (int i=0; i <= x.size()+1; i++) {
      xArray[i] = new int[y.size()+1];
    ..
    ..
    
    for (int k=0; k <= x.size()+1; k++) {
        
          xArray[k] = NULL;    
           delete[] xArray[k];    
      }
      delete[] xArray;
    

    MoviesMain: malloc.c:2401: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
    Aborted (core dumped)

    Damit er scheint immer dieser Fehler
    Kann mir jemand sagen wie ich es richtig machen

    Vielen Dank

    Viele Grüße
    Chris



  • Hallo,

    deine Schleifen gehen alle einen zu weit (<= size + 1).


  • Mod

    1. Das ist kein 2D-Array, sondern eher so eine Art Liste von Listen. Ein dynamisches 2D-Array macht man mit einem großen 1D-Array und man rechnet dann selber von den 2D-Indizes den zugehörigen 1D-Index aus. Hier im Forum geisterte vor ein paar Wochen auch eine fertige Komplettlösung dafür herum, ansonsten ist das auch ziemlich einfach selber zu machen.
    2. Benutze in C++ niemals new/delete! Hier wäre vector perfekt. Dann erledigen sich auch sämtliche Fragen von Ressourcenverwaltung von ganz alleine.
    3. Such dir einen besseren Lehrer oder besseres Lehrbuch. Eines, wo RAII, vector, und Konsorten drin erklärt werden, und das dir new/delete nur beibringt, um dir zu zeigen, wieso der normale Weg so viel besser ist.


  • @Jockelx sagte in delete von 2D array:

    Hallo,

    deine Schleifen gehen alle einen zu weit (<= size + 1).

    Es sind sogar zwei.



  • @manni66

    Warum? Es wird auch +1 allokiert.



  • @Jockelx
    Stimmt.



  • Mal abgesehen von den anderen (richtigen) Einwänden:

    xArray[k] = NULL;
    delete[] xArray[k]; 
    

    Wenn, dann anders herum.



  • @SeppJ

    Erst einmal viel Dank für die Tipps
    Ich kann dir nur sagen was ich bei mir an der Uni gelernt und
    unser Prof. das Arrays im vergleich zu Vectoren der STD effzienter sind.
    Vielleicht hab ich da auch was falsch verstanden
    Wo genau kann ich das mit new/ delete nach lesen ?
    Könntest du mir den ein Buch empfehlen



  • @yahendrik sagte in delete von 2D array:

    Wenn, dann anders herum.

    Was "anders herum"?

    int **foo = new int*[42];
    for(std::size_t i{}; i < 42; ++i)
        foo[i] = new int[13];
    
    // use foo and while you do when an exception occurs you're sitting on a memory leak (y)
    
    for(std::size_t i{}; i < 42; ++i)
        delete[] foo[i];
    delete[] foo;
    

    Aber @ChrisProg42 das ist, wie dir @SeppJ schon gesagt hat etwas total Uneffizientes und Fehleranfälliges. std::vector<int> ftw.

    @ChrisProg42 sagte in delete von 2D array:

    unser Prof. das Arrays im vergleich zu Vectoren der STD effzienter sind.

    Ne, du hast wahrscheinlich nichts falsch verstanden, dein Prof aber wahrscheinlich schon. Ein std::vector<> ist bei optimiertem Code nicht mehr oder weniger schnell als ein Array. (Wer etwas anderes behauptet zeige seinen Benchmarking-Code und Ergebnisse mit mindestens 3 verschiedenen Compilern (gcc, clang, msvc)*)`.

    @ChrisProg42 sagte in delete von 2D array:

    Wo genau kann ich das mit new/ delete nach lesen ?

    Was willst du nachlesen? Alles was mit new besorgt wurde, muss mit delete freigegeben werden, alles was mit new[] besorgt wurde, muss mit ´delete[]freigegeben werden. Andererseits, wie du schon gesagt bekommen hast, solltenewunddelete` in modernem C++ (außer du schreibst eine library) nicht mehr vorkommen. Informiere dich über container und smart pointer.

    *)` Dieser "Disclaimer" ist aufgrund des hohen Trollaufkomms hier leider nötig.



  • @Swordfish sagte in delete von 2D array:

    Was "anders herum"?

    Na, die Zeilen vertauschen:

    delete[] xArray[k];
    xArray[k] = NULL;
    

    (bzw. gleich die 2. Zeile löschen, da überflüssig)



  • @Th69 Haha, ja. Now i see.

    @Th69 sagte in delete von 2D array:

    (bzw. gleich die 2. Zeile löschen, da überflüssig)

    Ja, sehr flüssig und über.

    @ChrisProg42 In deinem Code vom ersten Post fehlen ein paar Sternchen. Wenn dein Compiler dich nicht warnt ist dein warning-level zu niedrig (für die Un*x-(gcc)-verseuchten: -Wall -Wextra -Werror).


Anmelden zum Antworten