Einfache Frage zu new



  • Hallo,

    obwohl dies eine ganz einfache Frage ist, konnte ich leider keine Antwort in einem der mir bekannten Tutorials finden.

    string *i;
    i = new string ("Hallo");
    i = new string ("Welt");
    // hier noch irgendwas
    delete i;
    

    Was geschieht hier mit dem Wert "Hallo"? Wird er mit "Welt" überschrieben oder verweist der Zeiger nach dem zweiten new auf einen neuen Speicherbereich und der alte bleibt zurück, ohne dass man noch auf ihn zugreifen kann?

    Danke



  • Also das nennt man dann Memory Leak was daraus entsteht 😉 Du reservierst den Speicher, hast aber dann keine Möglichkeit mehr darauf zuzugreifen, weil du keinen Zeiger auf die Speicheradresse mehr hast und somit den Bereich nicht mehr per delete freigeben kannst.



  • Hi basti33,

    nur mal der Vollständigkeit halber: Du weiß aber schon, dass Du das auch ohne new/delete machen kannst ?

    string i("Hallo");
    

    (sage das nur, weil es ein wenig nach "typischem Java-Umsteigercode" aussieht)

    Gruß,

    Simon2.



  • @Simon2
    Ja, weiß ich und ich hab noch nie Java verwendet 😉 .

    Ich will das auch nicht mit std::string machen, sondern mit selbstdefinierten Typen. Das hier diente nur der Veranschaulichung.



  • Dann bin ich ja beruhigt. 🙂



  • Was genau passiert:

    string *i;
    // besser:
    string *i = NULL;
    

    Du erstellst einen Zeiger vom Typ std::string. Der zeigt aber irgendwo ins Nirvana. Also besser auf NULL initialisieren.

    i = new string ("Hallo");
    

    Du reservierst Speicher für ein neues Objekt vom Typ std::string und speicherst die Adresse in i.

    i = new string ("Welt");
    

    Du reservierst wieder Speicher für ein neues Objekt vom Typ std::string und speicherst die Adresse in i. Der alte String ist im Speicher noch vorhanden, allerdings kennst du jetzt die Adresse nicht mehr. Du hast soeben ein Speicherleck erzeugt.

    delete i;
    

    Du löschst die Speicherstelle mit dem Inhalt "Welt". Das vorherige bleibt wie oben geschrieben im Speicher.

    Besser:

    string *i;
    i = new string ("Hallo");
    delete i;
    i = new string ("Welt");
    // hier noch irgendwas
    delete i;
    

    oder:

    string *i;
    i = new string ("Hallo");
    i->append(" Welt"); // einfach Welt anhängen
    // hier noch irgendwas
    delete i;
    

    HTH
    rya.



  • basti33 schrieb:

    @Simon2
    Ja, weiß ich und ich hab noch nie Java verwendet 😉 .

    Ich will das auch nicht mit std::string machen, sondern mit selbstdefinierten Typen. Das hier diente nur der Veranschaulichung.

    Aber gilt auch für selbst definierte Typen.



  • Scorcher24 schrieb:

    Besser:

    string *i;
    i = new string ("Hallo");
    delete i;
    i = new string ("Welt");
    // hier noch irgendwas
    delete i;
    

    Noch besser:

    std::tr1::shared_ptr<string> i;
    i.reset(new string("Hallo"));
    // hier nix mehr ;)
    

Anmelden zum Antworten