www.mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
class Item {
  private:
    int nr;
    int wert;
  public:
    Item(int item_number) {nr = item_number;}
    int getWert() {return wert;}
    void setWert(int x) {wert = x;}
};

class Station {
  private:
    int anzItems;    
  public:    
    Station() {anzItems = 0;}    
    Item *item;
    int getAnzahl() {return anzItems;};
    void AddItem(void) {
      ++anzItems;
      item = new Item(anzItems);
  }
};
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ß


Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs jetzt mal so gemacht:
class Station {
  private:
    int anzItems;    
  public:    
    Station() {anzItems = 0;}
    ~Station() {
      while (anzItems >= 0) {
        delete item[anzItems--];
      }
    }
    Item *item[MAX_ITEMS];
    int getAnzahl() {return anzItems;};
    void AddItem() {
      item[anzItems] = new Item(anzItems);      
      ++anzItems;
    }
};
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:
Station *sta;
sta = new Station();  
for (int i = 0; i < MAX_ITEMS; i++) {
  sta->AddItem();
  sta->item[i]->setWert(i);
}
delete sta;
auf die Elemente zugreifen.

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...oder man benutzt die Klassen aus der STL: vector oder list
Bspw.
class Station {
private:
   vector<Item> mItems;
public:
   void AddItem(void) {
      Item newItem(...);
      mItems.push_back(newItem);             
   }
}    

  

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.