nullptrs in list



  • class AnElement {
        void Oompa_Loompa_make_some_chokolate() { // wird automatisch aufgerufen.
            delete this;
        }
    };
    
    class AList {
        std::list<std::shared_ptr<AnElement> > elements_;
    
    public:
        void add(std::shared_ptr<AnElement> element) {
            elements_.push_back(element);
        }
    };
    

    Nach einer Zeit wird 'elements_' sehr viele ungültige std::shared_ptrs enthalten.

    Müsste ich bei jedem `add´ überprüfen ob `elements_´ nullptrs enthält?
    Oder gibt es da was spezielleres?



  • delete this; Bei shared_ptr gehaltenen Objekten ist böse. Dadurch, dass du das Ding einem shared_ptr übergeben hast, hast du dem shared_ptr die alleinige Herrschaft über Leben und Tod des Objektes gegeben. Ein delete this hintergeht diese Eigentumszusage. Der shared_ptr wirds dir mit einem bösen crash danken (Nämlich wenn der letzte shared_ptr das Objekt nochmal zerstören will).

    Fazit: So gehts nicht. Was willst du erreichen?



  • Stimmt. Habe daran nicht gedacht.
    Ich habe eine Liste, in der Liste sind Elemente drin, die nach einer Zeit ungültig werden (automatisch).

    Nun dachte ich, dass man die Elemente "automatisch" aus der Liste löschen könnte, aber wahrscheinlich spricht der müde Mensch aus mir.

    boost::pointer_container würde ja nur den Speicher am Ende des Scopes freigeben, wenn ich das richtig verstanden habe.



  • Wenn die Dinger sich selbst aus irgendeinem Container entfernen sollen, müssen sie einen Pointer oder eine Referenz auf den Container haben. Wie soll sonst der Container mitbekommen, dass sein Element das Zeitliche gesegnet hat.

    Alternativ wäre vielleicht eine bool isValid() Methode für die Klasse sinnvoll und du räumst gelegentlich deinen Container auf (z.B. std::remove_if)

    bei boost::pointer_container hast du das gleiche Problem wie der shared_ptr: pointer_container besitzen ihre Elemente.


Anmelden zum Antworten