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.