Frage zu dynamische Erzeugung
-
Hallo zusammen,
was ist denn der Unterschied zwischen folgenden Textzeilen:
TestKlasse *test[5]; TestKlasse *test = new TestKlasse[5];In der ersten Zeile würde ich dann nach und nach die OBjekte mit new anlegen. Aber wo ist hier der Unterschied im Bezug auf Array?
Danke!
-
Noob11 schrieb:
nach und nach die OBjekte mit new anlegen ... Unterschied
-
Die erste Zeile erzeugt ein Array von fünf Zeigern (die noch ins Nirvana verweisen). Die zweite Zeile erzeugt einen Zeiger, der auf ein einen Speicherplatz mit fünf Objekten verweist.
-
Erste Variante kann man dann nehmen, wenn man vorher weiß wie viele Elemente das Array haben wird. Die zweite Variante kann man dann nehmen, wenn die Anzahl der Elemente erst zur Laufzeit bekannt ist.
-
fghfgh schrieb:
Erste Variante kann man dann nehmen, wenn man vorher weiß wie viele Elemente das Array haben wird. Die zweite Variante kann man dann nehmen, wenn die Anzahl der Elemente erst zur Laufzeit bekannt ist.
Wenn da kein * wäre, hättest Du Recht.
-
Hi,
danke für die Antworten!
Wie lösche ich dann die Objekte wieder mit delete?
Bei der ersten Zeile geht das ja so:
delete test[0];und dann halt noch für die anderen Objekte.
Hier wird dann einfach der Zeiger gelöscht, oder? Wenn kein Zeiger mehr auf einen Speicherplatz referenziert, wird dann automatisch der Speicherplatz freigegeben, oder wie läuft das ab?
Gruß
-
Noob11 schrieb:
Hier wird dann einfach der Zeiger gelöscht, oder? Wenn kein Zeiger mehr auf einen Speicherplatz referenziert, wird dann automatisch der Speicherplatz freigegeben, oder wie läuft das ab?
Nein, mit dem delete wird der Speicherplatz direkt freigegeben. C++ hat keinen Garbage Collector

Im zweiten Fall gibst du alle Elemente mit einem
delete[] test;wieder frei.
-
Bei deinem Code wird der Speicherplatz, auf den der Zeiger test[0] zeigt, wieder zur Benutzung vom Betriebssystem freigegeben. Dein Zeiger zeigt aber immer noch dort hin. Bei der zweiten Variante brauchst du ein
delete[] test;Das gibt den Speicherplatz der 5 aneinandergehängten Elemente frei.
-
Abend,
Also erstmal: delete darf nur auf den Speicher angewendet werden, der mit new allokiert wurde.Bei deinem ersten Beispiel... die Zeiger zeigen auf nichts das mit new angelegt wurde, deshalb kein delete. Um genau zu sein, zeigen dein 5 Zeiger irgendwo hin wo es gerade so Spaß macht.
Hier
TestKlasse *test = new TestKlasse[5]allokierst du Speicher mit new, deshalb musst du ihn mit delete wieder freigeben. Da es sich hierbei um ein Array handelt machst du es so:
delete[] test;
-
Eisflamme schrieb:
fghfgh schrieb:
Erste Variante kann man dann nehmen, wenn man vorher weiß wie viele Elemente das Array haben wird. Die zweite Variante kann man dann nehmen, wenn die Anzahl der Elemente erst zur Laufzeit bekannt ist.
Wenn da kein * wäre, hättest Du Recht.
Recht hat er trotzdem

Auch wenn das erste nicht dem zweiten entspricht.
Wenn manint arr[5]; int* p = new int[5];Dann sind einmal die 5 int auf dem Stack und einmal auf dem Heap. Bei dem obigen Beispiel, sind es im ersten Fall eben 5 Zeiger auf TestKlasse auf dem Stack und im zweiten Fall 5 TestKlasse Objekte auf dem Heap. Aber dies ändert nichts an der Tatsache, dass ich bei der ersten Variante ein konstanten Ausdruck brauche und bei der zweiten Variante nicht

Lg freeG
-
Noob11 schrieb:
TestKlasse *test[5]; TestKlasse *test = new TestKlasse[5];[...] wo ist hier der Unterschied [...] ?
In der ersten Zeile legst Du 5 Zeiger an, die jeweils uninitialisiert bleiben.
In der zweiten Zeile legst Du nur einen Zeiger an und lässt diesen auf das erste Element eines im Freispeicher erzeugten Arrays zeigen.
Möglicherweise ist das erste Sternchen bei Dir ein Versehen und es sollte
TestKlasse test[5];heißen. Dann hättest Du 5 TestKlasse-Objekte im automatischen Speicher angelegt.
Guck in Deinem schlauen C++ Buch nach, was Du zu folgenden drei Speicherbereichen findest:
- statischer Speicher
- Automatischer Speicher (meist ein Stapelspeicher, "Stack")
- Freispeicher (auch bekannt unter "Heap")