Fragen zum Destruktor



  • Ich habe da eine Frage zum Destruktor. Bisher sind Destruktoren bei mir einfach immer nur leer und ich habe mir noch keine Gedanken darüber gemacht, nun hab ich aber eine Klasse wo das glaub angebracht wäre:

    class BildDaten : public Daten
    {
      public:
        BildDaten(std::string, int, int, Bild*);
        virtual ~BildDaten();
        int leseWert() const;
    
      private:
        Bild* B;
    
    };
    
    BildDaten::BildDaten(std::string S, int B, int W, Bild* b) : Daten(S, B), Wert(W), B(b) {};
    
    BildDaten::~BildDaten(){};
    

    Wie zu sehen hab ich nun einen privaten Zeiger auf ein Bild, das bei Erstellung in Konstruktor übergeben wird. Heißt das ich muss bei der Löschung eines solchen Objektes dafür sorgen, dass das Objekt (Bild) hinter dem Zeiger B auch gelöscht wird? Dann muss in den Destruktor ein delete B?
    Kann ich sagen, dass wenn eine Klasse nur primitive Datentypen (int, float, usw.) enthält der Destruktor leer sein kann, bei Zeigern ich mir aber mehr überlegen muss?

    Vielen Dank!



  • Wenn BildDaten den Besitz und die Kontrolle über das Bild übernehmen soll, sollten im Destruktor falls nötig Resourcen freigegeben werden.
    Das muss ja aber nicht immer der Fall sein.
    Dir muss dabei auch klar sein, dass das Bild gelöscht ist sobald ein BildDaten Objekt seinen Destruktor aufruft. Vor allem bei Kopien von BildDaten musst du da genau aufpassen (z.B. wenn du solche Objekte in einen Container packst). Am einfachsten ist es hier einen tr1::shared_ptr<Bild> zu verwenden, der die Kontrolle drüber übernimmt wann das Bild gelöscht wird, nämlich wenn es wirklich niemand mehr braucht.

    Generell ist aber der Destruktor genau der richtige Ort für Aufräumarbeiten (RAII)



  • Das mit der Kontrolle hab ich geregelt, vielen Dank!

    Hab da nun ein konkretes Problem mit dem Destruktor in Zusammen hang mit boost::thread. Dafür hab ich aber besser einen eigenen Thread gemacht: http://www.c-plusplus.net/forum/viewtopic-var-p-is-1841446.html#1841446
    Ich hoffe jemand kann mir weiterhelfen 😞


Anmelden zum Antworten