Probleme mit new und delete (Programmabsturz)



  • Hallo !

    Für mich ist diese Verhalten nicht so ganz schlüssig, denn imho mache ich alles richtig, aber anscheinend ja nicht.

    So in etwas sieht die Funktion aus:

    void getdata(unsigned char *out, unsigned int len) {
        unsigned char *buffer = new unsigned char[20];
        unsigned int n = 0;
    
        while ( len != 0) {
            /* Code ... */
            n = (len < 20) ? len : 20;
            memcpy(out, buffer, n);
    
            out += n;
            len -= n;
    
        }
    
        /* Jetzt soll der Puffer gelöscht werden */ 
        delete [] buffer;
    }
    

    Diese Funktion wird ziemlich oft aufgerufen. Manchmal "crasht" dann die Anwendung und manchmal funktioniert alles. Wenn ich das delete am Ende entferne, kommt es NIE zum Crash. Woran kann das liegen ???

    P.S.: Ist es wichtig/sinnvoll ein delete in solch einem Fall einzusetzen oder wird der String sowieso zerstört ?



  • hm, ich frag mich warum du überhaupt new verwendest, schliesslich legst
    du die anzahl des Arrays ja auf 20 fest. Imho würde es reichen ein char array[20];
    zu nehmen...

    Devil



  • devil81 schrieb:

    hm, ich frag mich warum du überhaupt new verwendest, schliesslich legst
    du die anzahl des Arrays ja auf 20 fest. Imho würde es reichen ein char array[20];
    zu nehmen...

    Hat das Vor- oder Nachteile ein new zu verwenden. Habe es warscheinlich gemacht bzw. noch nicht geändert da die Funktionen vorher noch einen Parameter mehr hatte, der die Anazhl der zu reservierenden Bytes angab.

    Aber warum bekomme ich teilweise einen Crash mit dem delete Aufruf ?



  • Hm, ich kann keinen Fehler an dem delete entdecken. Bist Du ganz sicher, daß es daran liegt? Ansonsten wäre es eine Überlegung wert vielleicht std::string zu verwenden.

    Du scheinst ja einfach die ersten 20 Zeichen eines Strings haben zu wollen oder, falls er eben kürzer ist den ganzen string.
    Das geht sehr viel einfacher, da std::string eine sehr nette Methode namens substr anbietet, die genau das erledigt. Allerdings arbeitet std::string auch chars und nicht auch unsigned chars. Aber notfalls kann man sich ja auf basic_string<unsigned char> zurückziehen.

    MfG Jester



  • prüfe mal nach wenn du in buffer schreibst das du inerhalb des arrays bleibst



  • Dimah schrieb:

    prüfe mal nach wenn du in buffer schreibst das du inerhalb des arrays bleibst

    Das ist 100%tig korrekt. Also daran liegt es nicht.

    Aber ist es denn wichtig für die Funktionsvariable ein delete aufzurufen oder muss das gar nicht gemacht werden ?

    Jester schrieb:

    Hm, ich kann keinen Fehler an dem delete entdecken. Bist Du ganz sicher, daß es daran liegt?

    Ja, denn wenn ich es herausnehme, gibt es keinen Programmabsturz mehr.

    -----------edited--------------------------------------------------------------

    Mein Programm stürzt ab, dann drücke ich auf Abbrechen zum Debuggen und erhalte diese Code stelle der delete Funktion als markiert

    /* verify block type */
            _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
    

    Kann mir jemand sagen, was das zu bedeuten hat ?



  • Ja, das delete musst du auf jeden Fall aufrufen, da du sonst ein Memory Leak bekommst.
    Muss man den Sinn dieses Codes eigentlich verstehen?
    buffer ist nicht initialisiert, das heisst, du hast 20 Byte Datenmüll. Und die kopierst du in out ...
    Kann es sein, dass manchmal nicht die wirkliche Länge von out wiedergibt?



  • dEUs schrieb:

    Muss man den Sinn dieses Codes eigentlich verstehen?

    Warum ?

    dEUs schrieb:

    buffer ist nicht initialisiert, das heisst, du hast 20 Byte Datenmüll. Und die kopierst du in out ...

    Tatsache ? Würde ein memset da Abhilfe schaffen ?

    dEUs schrieb:

    Kann es sein, dass manchmal nicht die wirkliche Länge von out wiedergibt?

    Mein Output ist eigentlich immer 20 Byte lang, aber es stecken nicht immer 20 Zeichen darin. 😕

    dEUs schrieb:

    Ja, das delete musst du auf jeden Fall aufrufen, da du sonst ein Memory Leak bekommst.

    Auch wenn ich statt char *b = new char[12] dann char b[12] schreibe ?


Anmelden zum Antworten