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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.