Speicherfreigabe



  • Hallo Zusammen,

    ich habe folgende Klassenkonstruktion

    class Cube
    {
      Cube(); -->allokiert Speicher
      ~Cube(); --> gibt Speicher wieder frei
      float points[8][3];
      ...
    }
    class TemperatureCube : public Cube
    {
      public
        TemperatureCube(); -->??? soll Konstruktor von Cube aufrufen (:Cube())
        ~TemperatureCube(); -->??? soll Dekonstruktor von Cube aufrufen (???)
        float eigenschaft;
       ...
    }
    class TemperaturField
    {
      public:
        TemperaturField() --> tut eigentlich nichts
        ~TemperaturField() --> braucht meines Erachtens nichts zu tun, da vector die Speicherfreigabe organisiert
        vector<vector<TemperatureCube> > m_pTemperatures;
    }
    

    Ich habe eine Temperaturmatrix welche eine 2 Dimensionalen Vector mit TemperaturCube´s erzeugt. Bei der Erzeugung soll nun der Standardkonstruktor von TemperatureCube und Cube aufgerufen werden.

    Beim Beenden des Programmes sollt natürlich der ganze allokierte Speicher wieder freigegeben werden. Da die Vector-Klasse dies in der Klasse TemperaturField selber vornimmt.
    Allerdings bekomme ich beim Beenden eine ganze Menge Fehler über nicht freigegebene Speicher. Der meines Erachtens aus der fehlenden Freigabe des Speichers der Cube-Klasse herrührt. Meine Versuche den Speicher freizugeben sind bis jetzt irgendwie alle fehlgeschlagen.

    Kann mir vielleicht jemand mal eine Hilfestellung geben.

    Vielen Dank

    Maik



  • Opor schrieb:

    class Cube
    {
      Cube(); -->allokiert Speicher
      ~Cube(); --> gibt Speicher wieder frei
      points[8][3] = ...;
      ...
    }
    

    Was soll denn das "points[8][3]=..." an dieser Stelle? In der Klassendeklaration dürfen keine Anweisungen stehen.

    Ich habe eine Temperaturmatrix welche eine 2 Dimensionalen Vector mit TemperaturCube´s erzeugt. Bei der Erzeugung soll nun der Standardkonstruktor von TemperatureCube und Cube aufgerufen werden.

    Der Konstruktor von TemperaturCube ruft automatisch den Default-Konstruktor von Cube auf, bevor er seine eigenen Anweisungen abarbeitet, genauso ruft der Destruktor nach den eigenen Aufräumarbeiten den Destruktor der Basisklasse auf.

    Beim Beenden des Programmes sollt natürlich der ganze allokierte Speicher wieder freigegeben werden. Da die Vector-Klasse dies in der Klasse TemperaturField selber vornimmt.

    Der vom Vektor belegte Speicher wird vom Vektor selber aufgeräumt. Was deine Objekte noch zusätzlich anfordern, mußt du auch selber wieder aufräumen.

    Allerdings bekomme ich beim Beenden eine ganze Menge Fehler über nicht freigegebene Speicher. Der meines Erachtens aus der fehlenden Freigabe des Speichers der Cube-Klasse herrührt. Meine Versuche den Speicher freizugeben sind bis jetzt irgendwie alle fehlgeschlagen.

    Wie sehen denn diese Versuche aus?



  • points sollte bloss als Pseudocode dienen, um eigentlich den Speicher zu verdeutlichen den ich in der Basisklasse anlegen. War aus Versehen an der Falschen stelle platziert.

    Okay, dass habe ich mir auch schon so gedacht. Leider wird der Speicher der von der Klasse Cube belegt wird nicht wirklich freigeben. ->MemoryLeaks.
    Im Konstruktor der Klasse Cube mittels new allokiert und im Dekonstruktor mittels delete freigeben. Wenn ich die Klasse Cube ohne die abgeleitete Klasse nutze, funktioniert es.

    Ich weiß aber nun nicht warum immernoch Speicherfehler kommen.



  • Ohne konkreten Code (die Fragmente da oben reichen nicht für den Überblick) wird es recht schwer, da etwas zu diagnostizieren.

    So sollte es eigentlich funktionieren:

    class Cube
    {
    public:
      Cube() {m_data=new string[10];}
      ~Cube() {delete[] m_data;}
    private:
      string* m_data;
    };
    
    class TemperaturCube : public Cube
    {
    public:
      TemperaturCube() {m_data2=100;}
      ~TemperaturCube() {}
    private:
      int m_data2;
    };
    
    class TemperaturFeld
    {
    public:
      ...
    private:
      vector<vector<TemperaturCube> > m_feld;
    };
    


  • Hier wird aber noch ein CopyCtor für Cube und TemperaturCube benötigt.



  • Trotzdem vielen Dank erstmal!



  • Braunstein schrieb:

    Hier wird aber noch ein CopyCtor für Cube und TemperaturCube benötigt.

    Ups, stimmt (zumindest für Cube - der TemperaturCube-CopyCtor sollte damit richtig arbeiten).


Anmelden zum Antworten