Problem: Pointer && Unnötige Daten löschen



  • Sehr geehrtes Forum,
    ich habe mal wieder ein Problem.

    Ich weiß nicht genau wie ich es angehen soll, also ich schreibe gerade meine erste kleine Librarys für die Konsole, die den Umgang mit der Konsole erleichtern soll, und die Texte auch viel attraktiver dargestellt werden, z.B. wird der Text char-weise eingegeben, mit pausen bis zu 100 MS, oder selbstdefiniert, oder es listet daten mit Pfeilen (->) auf, usw.. .
    Alles kleinere Spielereien, welche den Umgang mit der Konsole doch nicht so trist und langweilig darstellen sollen.

    Auf jeden fall, ich habe eine Methode, und die heiß print(string s).

    void Console::print(string s)
    {
    // Ich tue hier Sachen mit dem string s
    
    delete &s;
    }
    

    Geht das so? Ich möchte nämlich den string nach dem ausgeben löschen, er soll ja keinen unnötigen Speicherplatz im Arbeitsspeicher einnehmen.

    Wie geht das?
    -> Mit Pointern
    Das ist mir schon klar, aber wie genau weiß ich nicht, das ist auch meine Frage. Wie kann ich das machen?
    Etwa so?

    void Console::print(string* s)
    {
    // Ich tue hier Sachen mit dem string s
    // Wie benutze ich s jetzt? so? : cout << s*; ???
    delete s;
    }
    

    Mit freundlichen und hocherachtungsvollen Grüßen,
    Developer::X(); 😃



  • Nutze delete dort, wo du auch new benutzt hast. Bei deinem ersten Beispiel: gar nicht. Die Methode bekommt eine Kopie von einem String und die wird automatisch am Ende der Funktion zerlegt.
    Bei deinem zweiten Beispiel bekommst zwar einen Pointer und löschst diesen auch (was an sich gültig wäre) aber das ist unschön. Denn alleine schon sowas würde zu einem Problem führen:

    std::string myString = "horst";
    print(&myString); // <-- kracht
    
    std::string *secondString = new std::string("blupp");
    print(secondString); // <-- geht
    print(secondString); // <-- kracht
    


  • ok da hast du auch wieder recht, danke,



  • Übrigens solltest du niemals "nützliche" Dinge wie Aufräumaktionen in Funktionen durchführen, in denen es keiner erwartet. print() gibt etwas aus und das war es auch schon.

    Meistens fährst du am besten, wenn du dem Benutzer die Speicherverwaltung überlässt (wenn dieser mit std::string & Co. arbeitet, ist das selten ein Problem).



  • Und du solltest Strings und andere größere Objekte per konstanter Referenz übergeben (const string& s), damit eine unnötige Kopie bei jedem Funktionsaufruf vermieden wird.

    Edit: wenn du Funktionen hast, welche die übergebenen Parameter "fressen" (d.h. löschen), solltest du das per std::auto_ptr machen. Damit kann dann nichts mehr schief gehen, außerdem wird der Benutzer dadurch über die Natur der Funktion informiert.


Anmelden zum Antworten