std::cout macht selbständig was im Hintergrund?



  • Jo thx 👍

    MfG SideWinder



  • ok - weiter gehts

    wenn ich aber

    map<string, Tier>tiere;
    

    mache und Tiere so

    tiere.insert(std::make_pair("esel",new Tier("esel")));
    

    hinzufüge dann hab ich da ein Objekt aus einer Klasse erzeugt und hinzugefügt und das bleibt wie der string bestehen oder? weil ist ja kein pointer sondern neues objekt?



  • nur dass du "new" nicht brauchst. Es wird vom container auch so wunderbar kopiert

    (der pointer wird ja auch wunderbar kopiert, mit dem unterschied, dass er nach dem verlassen der funktion ins leere zeigt)

    wobei, wenn du das so machst, dann funktioniert es evtl. schneller, wenn der container sich mal reallokieren muss. Dann müssen nähmlich nicht die ganzen objekte, sondern nur die kurzen zeiger kopiert werden. Dann pass aber auf, dass du das am ende alles sauber mit "delete" aufräumst!



  • In dem Fall bleibts dir länger als lieb ist.

    map<string, Tier> tiere;
    //                      ok, wird std::string  
    tiere.insert(make_pair("esel",
    //                             kein new, einfach schaun das Tier copy-constructor hat
                                   Tier("esel"));
    

    Wenn du da ein new hinwirfst, wird dir das Objekt am Heap angelegt und bleibt länger im Speicher als dir lieb ist. Nämlich bis du es wieder explizit mit delete freigibst - nie.

    MfG SideWinder



  • SideWinder schrieb:

    nie

    häää??? wo ist denn das problem?? 😕 😮 😕 😮



  • Wenn er dort ein new platziert müsste er die Map vor ihrer Zerstörung durchiterieren und alle Elemente mit delete freigeben. Einen solchen Code konnte ihc nicht entdecken, folglich ist er mit new dabei ein großes Speicherleck zu erzeugen.

    MfG SideWinder



  • ach, so meinst du das... na gut, hier steht aber ausser der faulheit nichts im wege. 🤡



  • jo aber copy konstruktor brauch ich wenn ich eine kopie erzeugen will ich will das tier aber ganz neu anelegen und nicht kopieren?



  • Downset schrieb:

    jo aber copy konstruktor brauch ich wenn ich eine kopie erzeugen will ich will das tier aber ganz neu anelegen und nicht kopieren?

    mit Tier("name") legst du ein ganz neues an. das wird dann in den datenbereich des containers reinkopiert und danach das originaltier gelöscht. hat am ende den gleichen effekt, als wäre das tier direkt im datenbereich des containers entstanden.



  • aha sonst mit new würde da ein pointer reinkopiert werden so wird nicht mehr mit pointer gearbeitet? so muss ich das Tier auch nicht mehr explizit löschen?



  • Ja.



  • Downset schrieb:

    aha sonst mit new würde da ein pointer reinkopiert werden so wird nicht mehr mit pointer gearbeitet? so muss ich das Tier auch nicht mehr explizit löschen?

    Ja, sonst würdest du den Pointer auf den mit new geholten Speicherbereich in der Map speichern. So speicherst du ein tatsächliches Objekt drinnen. Die Map kümmert sich nur das was sie wirklich besitzt (also im ersten Fall nur um den Pointer, im zweiten Fall nur um das Objekt). Fall 2 willst du - das sich die Map um das Objekt kümmert -> perfekt.

    MfG SideWinder



  • nein, das übernimmt der eingebaute allocator von dem container. Wo kein "new" ist, braucht man auch kein "delete". Zumindest solange der container gewissenhaft implementiert worden ist (was bei stl wirklich der fall ist, da geht gar nichts schief) [aber wenn man sich mühe gibt, kann man natürlich jederzeit memoryleaks reinbauen 😉 ]



  • Das mit den Allokatoren lassen wir erstmal außen vor, er kann die Map anwenden und weiß wie sie vorgeht - da müssen wir nicht gleich die großen Geschütze auffahren 😉

    MfG SideWinder



  • ok jetzt hab ich gecheckt - also kann man als schlussfolgerung sagen objekte sollten immer mit copy construktor angelegt werden ? weil da muss ich selber nix löschen? was bringts da mit new zu arbeiten?



  • typisch moi: hab mal in einem schlauen buch ein kompliziertes wörtchen gesehen, und versuche es jetzt in jeden zweiten satz einzubauen, um klüger auszusehen^^ 🤡 naja, dass sowas albernes nur bei vollnoobs zieht war mir schon klar 😃 😃 😃

    ps: war sowieso ein eher sinnloser beitrag, hab mich da wieder mal eingeloggt, und wollte einfach nich wieder verschwinden, ohne irgendetwas geschrieben zu haben :p
    (irgendwie ist es hier voll ruhig in den letzten paar stunden, nich?)



  • Downset schrieb:

    ok jetzt hab ich gecheckt - also kann man als schlussfolgerung sagen objekte sollten immer mit copy construktor angelegt werden ? weil da muss ich selber nix löschen? was bringts da mit new zu arbeiten?

    new setze ich ein wenn die Objekte zu groß sind um dauernd kopiert zu werden (ein Zeiger ist schneller kopiert) bzw. wenn ich die Techniker hinter dem dir wahrscheinlich noch unbekannten Stichwort "Polymorphismus" einsetzen möchte. Dann kann ich diese Vorteile haben, hab aber den Nachteil, dass ich mich selbst ums deleten kümmern muss.

    MfG SideWinder



  • Downset schrieb:

    ok jetzt hab ich gecheckt - also kann man als schlussfolgerung sagen objekte sollten immer mit copy construktor angelegt werden ? weil da muss ich selber nix löschen? was bringts da mit new zu arbeiten?

    a) manche objekte kann man nicht kopieren, zum beispiel objekte vom typ ofstream.
    b) ganz oft will man basisklassenzeiger speichern und die zeigen auf objekte, die davon geerbt haben.
    c) meistens spiel man mit zeigern aus lauter bastelfreude.


Anmelden zum Antworten