delete[]



  • Lumpensammler schrieb:

    ++ptr;
    

    das darfste nicht machen, 'delete' braucht die gleiche adresse, die 'new' ausgespuckt hat



  • deine for-schleife geht über die grenzen des array hinaus. net hat aber auch recht, erst schreibst du in speicher der dir nicht gehört und dann löscht du diesen 😃



  • enno-tyrant schrieb:

    ubd beim gcc 3.4.2 gibts gar keinen ärger (wird compilert und läuft)

    Das dürfte doch eigentlihc dann nicht sein, oder?

    borg schrieb:

    deine for-schleife geht über die grenzen des array hinaus. net hat aber auch recht, erst schreibst du in speicher der dir nicht gehört und dann löscht du diesen 😃

    wow..bin ich böse :p
    Naja..danke Leute..werd das gleich ändern.



  • Lumpensammler schrieb:

    enno-tyrant schrieb:

    ubd beim gcc 3.4.2 gibts gar keinen ärger (wird compilert und läuft)

    Das dürfte doch eigentlihc dann nicht sein, oder?...

    eigentlich nicht, er tuts aber trotzdem, hmm ... 😃



  • enno-tyrant schrieb:

    Lumpensammler schrieb:

    enno-tyrant schrieb:

    ubd beim gcc 3.4.2 gibts gar keinen ärger (wird compilert und läuft)

    Das dürfte doch eigentlihc dann nicht sein, oder?...

    eigentlich nicht, er tuts aber trotzdem, hmm ... 😃

    tja, sehr tolerant, der gute gcc. syntaktisch ist der code auch nicht ganz falsch. vielleicht mal warning-level hochsetzten. vielleicht merkt er dann was 😉
    edit: schlimmer ist, dass das programm läuft ohne abzustürzen. das geht nur unter linux 😃



  • Ich habs grad mal mit g++ 3.4 probiert, und siehe da:

    $ g++-3.4 -Wall -pedantic-errors t.cc
    $ ./a.out
    5
    0
    1
    free(): invalid pointer 0x804a00c!
    $ valgrind ./a.out
    ==5688== Memcheck, a memory error detector for x86-linux.
    ==5688== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al.
    ==5688== Using valgrind-2.2.0, a program supervision framework for x86-linux.
    ==5688== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al.
    ==5688== For more details, rerun with: -v
    ==5688==
    ==5688== Invalid write of size 4
    ==5688==    at 0x804887F: main (in /home/wu/a.out)
    ==5688==  Address 0x1B9F3050 is 0 bytes after a block of size 40 alloc'd
    ==5688==    at 0x1B9072D9: operator new[](unsigned) (vg_replace_malloc.c:139)
    ==5688==    by 0x8048859: main (in /home/wu/a.out)
    5
    0
    1
    ==5688==
    ==5688== Invalid free() / delete / delete[]
    ==5688==    at 0x1B9077CC: operator delete[](void*) (vg_replace_malloc.c:162)
    ==5688==    by 0x8048914: main (in /home/wu/a.out)
    ==5688==  Address 0x1B9F302C is 4 bytes inside a block of size 40 alloc'd
    ==5688==    at 0x1B9072D9: operator new[](unsigned) (vg_replace_malloc.c:139)
    ==5688==    by 0x8048859: main (in /home/wu/a.out)
    ==5688==
    ==5688== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 14 from 1)
    ==5688== malloc/free: in use at exit: 40 bytes in 1 blocks.
    ==5688== malloc/free: 1 allocs, 1 frees, 40 bytes allocated.
    ==5688== For a detailed leak analysis,  rerun with: --leak-check=yes
    ==5688== For counts of detected errors, rerun with: -v
    


  • also wie schon erwähnt, es wird ohne warnungen compiliert und läuft

    programmausgabe schrieb:

    5
    0
    1

    OS: w2k3 😃 (diesmal nix linux)

    //edit: fehler entfernt



  • enno-tyrant schrieb:

    also wie schon erwähnt, es wird ohne warnungen compiliert und läuft

    programmausgabe schrieb:

    5
    0
    1

    OS: w2k3 😃 (diesmal nix linux)

    //edit: fehler entfernt

    warum sollte der compiler da helfen? es ist eindeutig ein laufzeitfehler, und bekanntlich tritt der auf, wann er will 😉

    da muss schon der programmierer schauen, dass er diszipliniert ist und aufpasst ..
    wie wärs mit einem hilfzeiger auf das erste element des arrays? damit hätte man zwei, einen zum laufen, und einen zum 'deleten'

    was wäre das leben langweilig ohne laufzeitfehler 🤡



  • elise schrieb:

    da muss schon der programmierer schauen, dass er diszipliniert ist und aufpasst ..

    wenn ich 'nen c++ compiler coden würde, dann würde ich ein warning ausspucken wenn einer den rückgabewert von 'new' einem pointer zuweist, der nicht 'const' ist



  • und wo bleibt dann die pointerarithmetik? *g*

    ich find, meine zwei zeiger waren der weg ... 😉 aber wegen mir mach den ersten const.


Anmelden zum Antworten