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 machenVielen Dank
Viele Grüße
Chris
-
Hallo,
deine Schleifen gehen alle einen zu weit (<= size + 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.
- Benutze in C++ niemals new/delete! Hier wäre vector perfekt. Dann erledigen sich auch sämtliche Fragen von Ressourcenverwaltung von ganz alleine.
- 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.
-
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 mitdelete
freigegeben werden, alles was mitnew[]
besorgt wurde, muss mit ´delete[]freigegeben werden. Andererseits, wie du schon gesagt bekommen hast, sollte
newund
delete` 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
).