Zugriffsverletzung bei delete



  • Hallo,

    ich bekomme immer wieder Zugriffsverletzungen, wenn ich versuche ein von mir
    angelegtes Array wieder zu löschen.

    Mir ist klar, dass sowas vorkommen kann, wenn man über die Grenzen des Arrays
    hinaus Daten schreibt.

    Im aktuellen Fall verwende ich aber das Array nur zum suchen, greife also nur lesend darauf zu. Trotzdem bekomm ich einen Fehler. Irgendwas mach ich falsch.
    Kann mir jemand sagen was?

    int GetInfo(void)
    {
        int cMask [] = {
            0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
            0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00, 0x11, 0x22,
            -2
        };
    
        int iFound=-1;
        int iFoundCount=0;
    
        MaskSearch(cBINFile, iBINFileSize, cMask, iFound, iFoundCount);
        ShowMessage(iFoundCount);
        delete cMask;   // hier kommt der Fehler, delete [] cMask; hab ich auch 
                        // versucht
        return iFound;
    }
    

    die MaskSearch Routine gibt es hier: http://www.gsm-dev.de/MaskSearch.cpp
    ich wär wirklich dankbar wenn jemand eine Idee hat an was das liegen kann.



  • Soviel ich weiss kann man delete nur auf Variablen anwenden, die mit new erzeugt wurden.

    Wenn ich nicht irgendwas übersehen habe erzeugst du dein Array ja im stack und nicht im heap, brauchst es also nicht mit delete freigeben bzw. musst es im heap mit new erzeugen.

    Auf ein Array musst du dann delete[] verwenden!

    ciao

    robi1806



  • Für delete[] gilte das gleiche wie für delete! Also da das Array hier auf dem Stack erzeugt wird und dazu noch in einer Funktion, gilt das Array sowieso nur so lange wie sich der Compiler in der Funktion befindet. Ergo wird das Array automatisch mit verlassen der Funktion zerstört.



  • danke! Jetzt wird einiges klar.

    Zwei Fragen hab ich aber noch:
    - wenn ich in einer Funktion Speicher mit new reserviere muss ich den aber
    schon löschen oder?

    - gibt es eine Möglichkeit ein Array mit new zu reservieren und dieses dann
    ähnlich wie oben mit Werten zu füllen? Ich glaube zwar nicht aber evtl.
    geht es ja doch irgendwie...

    also z.B. so:
    char * cData = new char[10];
    cData = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    sowas wäre wirklich unheimlich praktisch...



  • double[] number = new double[5]{ 12.44, 525.38, 6.28, 2448.32, 632.04 };
    

    schon so probiert? In C# ginge das.



  • Grundsatz für new/delete:

    Egal wann und wo du new oder new[] aufrufst, musst du auch dafür sorgen das delete oder delete[] aufgerufen wird. Reservierst du in einer Funktion mit new[] Speicher und gibst diesen aber NICHT frei, dann hast du ein Speicherleck! Und wer will schon ein Speicherleck? Also musst du in der Funktion zu dem Zeitpunkt wo der Speicher nicht mehr benötigt wird das delete[] aufrufen.

    Und das was robi vorgeschlagen hat funktioniert in C++ so nicht.

    Was hingegen möglich ist wäre folgendes:

    int array[] = {0,1,2,3,4};
    


  • Ok, aber damit hat er's ja wieder im stack.
    Die Frage ist doch: Gibt es unter c++ einen Möglichkeit direkt zu initialisieren, auch wenn man im heap allokiert bzw. new verwendet?



  • Memset z.B.



  • Ich hätte da auch nochmal eine Frage zu new und delete.

    Egal wann und wo du new oder new[] aufrufst, musst du auch dafür sorgen das delete oder delete[]

    Was mach ich denn wenn ich in einer Funktion beispilsweise eine TStringList mit new anlege, diese aber als Rückgabewert an die aufrufende Funktion zurückgeben will ?

    Wo muss oder besser sollte ich die dann erzeugen bzw. wieder deleten um keine memleacks zu bekommen ?



  • Nachdem du sie nicht mehr brauchst?

    Funktionen die reservierten Speicher zurückgeben den dann der aufrufende löschen muss sind ohnehin nicht sehr optimal. Besser wäre es hier ein TStringList-Objekt als Referenz oder Zeiger zu verlangen, welches dann von der Funktion befüllt wird. Da behält dann auch der Aufrufende die Kontrolle über die Erstellung und Ermordung des Objekts.

    -junix


Log in to reply