Probleme mit delete



  • Hallo zusammen,

    folgender Codeschnippsel:

    // Get all icon objects from the vector and write its names into the XML file
    	for (int i=1; i< numberOfIcons; i++)
    	{
    		string temp = myIcons.getIconVector().at(i)->getName();
    		char *buf = new char[strlen(temp.c_str())];
    
    		strcpy(buf, temp.c_str());
    
    		XML.write(buf);
    
    		//...When you are done with buf...
    		delete []buf;
    
    	}
    

    Verursacht eine Heap-Corruption an der delete []buf;

    Hat jemand eine Idee, warum?

    gruß
    Alex



  • Ich glaub zwar nicht, dass es daran liegt, aber du solltest mit new[] ein Byte mehr Speicher anfordern, da strlen() nur die Länge des C-Strings ohne Nullterminierung zurückgibt.

    Ansonsten, deletest du zwei Mal, oder führst du sonstige Speicherzugriffe durch?



  • Danke!

    Anscheinend lag es doch daran, mit :

    char *buf = new char[strlen(temp.c_str())+1];

    funktioniert es. Aber warum verstehe ich nicht 😕



  • filth schrieb:

    Aber warum verstehe ich nicht 😕

    Steht aber in meinem oberen Post. Du solltest schon genug Speicher anfordern, sonst wird das '\0' irgendwo hingeschrieben.



  • Achso und delete versucht dann quasi einen zu langen Speicherabschnitt zu löschen?



  • weil das nullbyte am ende eines c-strings auch platz braucht und strlen gibt die länge des strings ohne dieses byte zurück. du willst ja die länge wissen, nicht die größe des benötigten speichers.

    wenn diese string-variable ein std::string ist, dann wäre folgender code besser:

    // Get all icon objects from the vector and write its names into the XML file
    	for (int i=1; i< numberOfIcons; i++)
    	{
                string temp = myIcons.getIconVector().at(i)->getName();
                XML.write(temp.c_str());
    	}
    


  • filth schrieb:

    Achso und delete versucht dann quasi einen zu langen Speicherabschnitt zu löschen?

    Nein, das delete[] löscht so viele Bytes, wie mit new[] angefordert wurden (vorausgesetzt, du hast einen gültigen Zeiger).

    strcpy() ist das Problem, da es alle char -Elemente inklusive '\0' kopiert und nicht darauf achtet, ob genügend Speicher vorhanden ist oder nicht.

    Das ist übrigens eines der Probleme von C, in C++ kann man das mit dem Datentyp std::string umgehen.



  • Der Vollständigkeit halber:
    1. strlen brauchst Du nicht zu bemühen, das kostet nur Zeit. string hat eine Methode size
    2. Wenn Du wirklich einen non-const Puffer brauchst, nimm C++-Mittel:

    {
            string temp = myIcons.getIconVector().at(i)->getName();
            vector<char> buf(temp.c_str(), temp.c_str() + temp.size() + 1);
    
            XML.write(&buf[0]);
    
            //...When you are done with buf...
            // ... NOTHING, 'cause this is C++
        }
    

Anmelden zum Antworten