dynamische Arrays



  • Arrays, die mit new[] erstellt wurden, werden mit delete[] gelöscht, nicht mit delete. Und wer garantiert dir, dass dynArray.vek in der init()-Funktion bereits auf etwas gültiges zeigt?



  • Danke für die Hilfe. Bin noch am Lernen ...

    Ja, es war vorgegeben, das mit einer Struktur und dynamischem Array zu realisieren. Deshalb habe ich z.B. keine Vektorklasse verwendet ....

    Bei der Ausführung des Programms zeigt er den Inhalt des Arrays nach der init-Funktion korrekt an, aber bei dem delete in der "loesche"-Funktion kommt folgende Ausgabe:

    0231e000-0233f000 rw-p 00000000 00:00 0                                  [heap]
    7f01c0500000-7f01c0515000 r-xp 00000000 fc:01 4456518                    /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f01c0515000-7f01c0714000 ---p 00015000 fc:01 4456518                    /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f01c0714000-7f01c0715000 r--p 00014000 fc:01 4456518                    /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f01c0715000-7f01c0716000 rw-p 00015000 fc:01 4456518                    /lib/x86_64-linux-gnu/libgcc_s.so.1
    7f01c0716000-7f01c0811000 r-xp 00000000 fc:01 4462481                    /lib/x86_64-linux-gnu/libm-2.15.so
    7f01c0811000-7f01c0a10000 ---p 000fb000 fc:01 4462481                    /lib/x86_64-linux-gnu/libm-2.15.so
    7f01c0a10000-7f01c0a11000 r--p 000fa000 fc:01 4462481                    /lib/x86_64-linux-gnu/libm-2.15.so
    7f01c0a11000-7f01c0a12000 rw-p 000fb000 fc:01 4462481                    /lib/x86_64-linux-gnu/libm-2.15.so
    7f01c0a12000-7f01c0bc7000 r-xp 00000000 fc:01 4462473                    /lib/x86_64-linux-gnu/libc-2.15.so
    7f01c0bc7000-7f01c0dc6000 ---p 001b5000 fc:01 4462473                    /lib/x86_64-linux-gnu/libc-2.15.so
    7f01c0dc6000-7f01c0dca000 r--p 001b4000 fc:01 4462473                    /lib/x86_64-linux-gnu/libc-2.15.so
    7f01c0dca000-7f01c0dcc000 rw-p 001b8000 fc:01 4462473                    /lib/x86_64-linux-gnu/libc-2.15.so
    7f01c0dcc000-7f01c0dd1000 rw-p 00000000 00:00 0 
    7f01c0dd1000-7f01c0eb3000 r-xp 00000000 fc:01 5243560                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
    7f01c0eb3000-7f01c10b2000 ---p 000e2000 fc:01 5243560                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
    7f01c10b2000-7f01c10ba000 r--p 000e1000 fc:01 5243560                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
    7f01c10ba000-7f01c10bc000 rw-p 000e9000 fc:01 5243560                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16
    7f01c10bc000-7f01c10d1000 rw-p 00000000 00:00 0 
    7f01c10d1000-7f01c10f3000 r-xp 00000000 fc:01 4462487                    /lib/x86_64-linux-gnu/ld-2.15.so
    7f01c12c7000-7f01c12cc000 rw-p 00000000 00:00 0 
    7f01c12ef000-7f01c12f3000 rw-p 00000000 00:00 0 
    7f01c12f3000-7f01c12f4000 r--p 00022000 fc:01 4462487                    /lib/x86_64-linux-gnu/ld-2.15.so
    7f01c12f4000-7f01c12f6000 rw-p 00023000 fc:01 4462487                    /lib/x86_64-linux-gnu/ld-2.15.so
    7fff961eb000-7fff9620c000 rw-p 00000000 00:00 0                          [stack]
    7fff96332000-7fff96333000 r-xp 00000000 00:00 0                          [vdso]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
    

    bei struct dynArr &dynArray meckert er nicht. Compiliert wird es ohne Fehler.



  • Ich denke es liegt nicht an dem delete [] sondern an der Schleife davor.
    Dir ist schon klar das if (i<pos) und if (pos>i) genau dasselbe ist?
    Deswegen werden werten an verk[-1] verändert, dass führt zu zerstörtem Speicher.



  • ähm *hüst* ja. Das war es ... es muss pos<i heissen. 🙄
    Sorry für die Umstände. Ich dachte ich mach beim Freigeben, was falsch.
    Jetzt funktioniert es.
    Danke !



  • Das bezweifle ich, denn folgendes ist immer noch nicht geklärt:

    Athar schrieb:

    Arrays, die mit new[] erstellt wurden, werden mit delete[] gelöscht, nicht mit delete. Und wer garantiert dir, dass dynArray.vek in der init()-Funktion bereits auf etwas gültiges zeigt?

    Außerdem scheint mir diese Zeile auch nicht richtig zu sein:

    if (dynArray.anz<pos) return;
    

    Auch anz ist keine gültige Position.



  • In der Funktion initStruct meckert er nicht bei delete .... Weiß nicht warum ??
    Das andere hab ich geändert geändert:

    if (dynArray.anz<=pos) return;
    

    und die int-werte als unsigned



  • Nur mal so aus Neugier:
    Da du in initStruct etwas löschst, musst du auch Speicher angefordert haben, oder?
    Kannst du uns mal zeigen wo und wie?



  • nein, habe keinen Speicher angefordert zu dem Zeitpunkt.
    Also ist das delete und Null sinnlos oder ?



  • Ja.
    Und um falsche Zugriffe zu vermeiden gibt es in C++ Zugriffsschutz...



  • ok. Danke.


Anmelden zum Antworten