Templates: Speicher freigeben im Destruktor



  • Hallo zusammen,

    für ein Uni-Projekt soll ich eine map (ass. array) selbst programmieren und in einem kleinen Programm mit der STL map "vergleichen". Soweit, sogut. Meine map Klasse läuft wunderbar.

    Eine Frage ist mir allerdings noch geblieben. Wir sollen die map Klasse als Template realisieren, zumindest den value Teil. Ich verwende mal für meinen Test einfach std::string als Typ. Somit kann ich im Destruktor einfach sowas schreiben wie

    val = "";
    

    Aber: Woher "weiss" ich im Destruktor, wie ich den Speicher für value freigeben kann? Ich meine, es muss ja nicht std::string, es könnte ja auch ein Objekt einer andere Klasse sein. In diesem Fall müsste ich ja dann eher ein

    delete val;
    

    verwenden. Wie kann ich also bei Templates wissen, wie ich den Speicher freigeben kann, wenn ich bei der Programmierung gar nicht weiss, welche Datentyp verwendet wird?

    Besten Dank im Voraus!
    Gruss, Matthias



  • haimat schrieb:

    Wie kann ich also bei Templates wissen, wie ich den Speicher freigeben kann, wenn ich bei der Programmierung gar nicht weiss, welche Datentyp verwendet wird?

    Du musst ja nur den Speicher freigeben, den du auch holst. Du musst also gucken, wo du überall Speicher allokierst und eben diesen wieder freigibst.
    Wenn deine map z.B. Objekte verwaltet, wirst du den Speicher ja wahrscheinlich mit new T[Anzahl]; oder mit malloc holen (kannste auch mal zeigen ;)). Und den Speicher musst du auch wieder freigeben.

    Ich glaube aber bzgl des string-Objekts hast du andere Verständnisschwierigkeiten:

    class A
    {
        public:
            A() // Constructor
            {
                // Vor dem Eintritt in den Konstruktor dieser Klasse
                //  wird der Standard-Konstruktor von text aufgerufen
            }
    
            ~A() // Drstructor
            {
                // Nach dem Austritt aus dieser Funktion wird der Destruktor
                //   der string-Klasse aufgerufen, der automatisch all ihren
                //   Speicher freigibt.
                // text=""; wäre unnützt und würde noch nicht mal allen Speicher
                // freigeben.
            }
    
        private:
            string text;
    };
    

    Soll heißen: Verwendet der Benutzer in deiner map Objekte wie string, dann geben die string-Objekte ihren eigenen Speicher selber frei. 🙂



  • Natürlich! der Destruktor wird ja selbst aufgerufen für den value Teil...
    Das mit dem String ist mir klar, ich mache das nur für mein eigenes Verständnis 🙂

    Besten Dank!


Anmelden zum Antworten