C++ Speicher für Objekte reservieren/freigeben

Gast #510159
Hallo,
ich bin grade dabei ein Programm von C auf C++ mit Klassen 
umzuschreiben, und hätte gerne mal einen Tip wie man am einfachsten 
Speicher für Objekte reserviert bzw. freigibt.
Hier mal meine Klassen:
1
class Item {
2
  private:
3
    int nr;
4
    int wert;
5
  public:
6
    Item(int item_number) {nr = item_number;}
7
    int getWert() {return wert;}
8
    void setWert(int x) {wert = x;}
9
};
10

11
class Station {
12
  private:
13
    int anzItems;    
14
  public:    
15
    Station() {anzItems = 0;}    
16
    Item *item;
17
    int getAnzahl() {return anzItems;};
18
    void AddItem(void) {
19
      ++anzItems;
20
      item = new Item(anzItems);
21
  }
22
};
Im Moment wird zwar Speicher für ein Item reserviert, aber noch nicht 
freigeben.
Wenn ich die Klassen so ließe, müsste ich ja im Destruktor der Station 
mittels einer Schleife die Items löschen.

Lässt sich die Speicherverwaltung auch irgendwie in der Item-Klasse 
anlegen (im Kon-/Destruktor?), oder wie macht man sowas am elegantesten?

Auf die Daten würde ich ganz gerne so:
Station sta;
sta.AddItem();
sta.item[0].setWert(123);
zugreifen.

Ich würde mich über einen Hinweis freuen.

Gruß

Gast #510171
Der operator zum Freigeben ist delete().

Du verlierst aber jedesmal, wenn Du mit AddItem ein Objekt anlegts, die 
Referenz auf das vorhergehende.
Dein Item pointer zeigt immer nur auf das letze Item, du mußt eine 
verkettete Liste einbauen.
Gast #510191
Hm, verkettete Listen versuche ich eigentlich immer soweit es geht zu 
vermeiden.

Ich habe mir auch schon überlegt, in der Station ein Array für die 
Item-Pointer anzulegen. Aber dann müsste ich das Array ja auch dynamisch 
vergrößern/verkleinern, wenn ein neues Item angelegt/gelöscht wird.

Wenn es geht, hätte ich die Speicherverwaltung für das Item auch gerne 
in der Item-Klasse.
Gast #510263
Habs jetzt mal so gemacht:
1
class Station {
2
  private:
3
    int anzItems;    
4
  public:    
5
    Station() {anzItems = 0;}
6
    ~Station() {
7
      while (anzItems >= 0) {
8
        delete item[anzItems--];
9
      }
10
    }
11
    Item *item[MAX_ITEMS];
12
    int getAnzahl() {return anzItems;};
13
    void AddItem() {
14
      item[anzItems] = new Item(anzItems);      
15
      ++anzItems;
16
    }
17
};
Dann wird zwar der Speicher für Zeiger auf die maximale Anzahl der Items 
reserviert, auch wenn er nicht benötigt wird. Aber so kann ich 
wenigstens komfortabel mit:
1
Station *sta;
2
sta = new Station();  
3
for (int i = 0; i < MAX_ITEMS; i++) {
4
  sta->AddItem();
5
  sta->item[i]->setWert(i);
6
}
7
delete sta;
auf die Elemente zugreifen.
Gast #510270
...oder man benutzt die Klassen aus der STL: vector oder list
Bspw.
1
class Station {
2
private:
3
   vector<Item> mItems;
4
public:
5
   void AddItem(void) {
6
      Item newItem(...);
7
      mItems.push_back(newItem);             
8
   }
9
}

Gast #510531
> Hm, verkettete Listen versuche ich eigentlich immer soweit es geht zu
> vermeiden.

Dann nimm std::list. Die versteckt die ganzen Details hinter einem 
Container-Interface.

> Ich habe mir auch schon überlegt, in der Station ein Array für die
> Item-Pointer anzulegen. Aber dann müsste ich das Array ja auch
> dynamisch vergrößern/verkleinern, wenn ein neues Item angelegt/gelöscht
> wird.

Das wäre ein prima Job für st::vector.

> Wenn es geht, hätte ich die Speicherverwaltung für das Item auch gerne
> in der Item-Klasse.

Der, der Items erzeugt, sollte auch für die Freigabe verantwortlich 
sein. In deinem Fall wäre das die Klasse Station.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.