C++/Arduino Objektspeicher freigeben

Gast #3292243
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
Gast #3292267
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
}
Persönliche Seite #3292284
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.

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