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
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 | }
|
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.