Forum: PC-Programmierung C++ Speicher für Objekte reservieren/freigeben


von Thomas (Gast)


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ß


von Klaus Falser (Gast)


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.

von Thomas (Gast)


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.

von Thomas (Gast)


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.

von arc (Gast)


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
}

  

von Rolf Magnus (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.