Forum: Mikrocontroller und Digitale Elektronik C++/Arduino Objektspeicher freigeben


von Lukas (Gast)


Lesenswert?

Hallo,

ich habe eine kurze Frage in Bezug auf Ojekte in C++ bzw C++ für 
Arduino. Wenn ich eine neue Instanz eines Objektes erstelle wird sofort 
der Speicher reserviert (Bitte um korrektur falls ich Blödsinn rede) 
Wäre ja an und für sich kein Problem, jedoch habe ich auf meinem µC nur 
begrenzt Speicher zur Verfügung. Nun möchte ich den Speicher wieder 
freigeben. Jedoch bin ich mir nicht ganz im Klaren wie das funktioniert.


Grüße und danke im Vorraus

von Kindergärtner (Gast)


Lesenswert?

Ein Objekt lebt in C++ nur zwischen den innersten geschweiften Klammen 
{} innerhalb derer es definiert wurde. Beispiel:
1
void myFunction (int i) {
2
  if (i > 5) {
3
    MyClass myObject; // Hier wird speicher angelegt und vom Konstruktor initialisiert
4
    myObject.doSomething (); // Mache was mit dem Objekt
5
  } // Block zuende - Speicher wird automatisch wieder freigegeben
6
  
7
  // Jetzt ist das Objekt schon wieder weg
8
  bla ();
9
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Kindergärtner schrieb:
> Ein Objekt lebt in C++ nur zwischen den innersten geschweiften Klammen
> {} innerhalb derer es definiert wurde.

... außer, wenn das Objekt mit new allokiert wurde. Dann lebt es 
solange, bis es mit delete wieder freigegeben wird.
1
void myFunction (int i) {
2
  if (i > 5) {
3
    MyClass* pmyObject; 
4
    
5
    pmyObject = new MyClass(); // Hier wird speicher angelegt und vom Konstruktor initialisiert
6
    pmyObject->doSomething (); // Mache was mit dem Objekt
7
8
    delete pmyObject;          // Objekt explizit freigeben
9
10
  } // Block zuende
11
  bla ();
12
}

Wird die Zeile mit dem delete vergessen, dann wirds unschön:
1
void myFunction (int i) {
2
  if (i > 5) {
3
    MyClass* pmyObject; 
4
    
5
    pmyObject = new MyClass(); // Hier wird speicher angelegt und vom Konstruktor initialisiert
6
    pmyObject->doSomething (); // Mache was mit dem Objekt
7
  } // Block zuende
8
  bla ();
9
}

Das zum Beispiel ist ein wunderbares Speicherleck. Das Objekt wird 
angelegt, aber der Zeiger darauf weggeworfen (sprich: der Block 
verlassen, in dem der Zeiger existiert), ohne das Objekt explizit zu 
löschen.

Also: Sobald mit Pointern auf Objekte gearbeitet wird, aufpassen.

von Kindergärtner (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> ... außer, wenn das Objekt mit new allokiert wurde.
Da das auf Controllern mit wenig Speicher wie den ATmega's, die auf den 
Arduinos verbaut sind, eher problematisch ist wollte ich ihn gar nicht 
erst in Versuchung bringen...

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.