C++ Speicher für Objekte reservieren/freigeben

Gast #510159
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

...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
Lesenswert?

> 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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren