Wenn mit new angelegt dann delete?
-
Hallo,
ich möchte nochmal kurz eine Bestätigung einholen, ob ich das auch wirklich richtig verstanden habe:
Nur wenn ich mit new irgendwas auf dem Heap angelegt habe, muss ich später mit delete wieder aufräumen ansonsten nicht. Stimmt das oder gibt es noch andere Fälle bei denen ich mit delete aufräumen muss?
Danke!
-
delete darfst du nur benutzen wenn du das Objekt vorher mit new erzeugt hast. Dabei darfst du auch nicht mit delete[] durcheinander kommen, was du nur benutzen darfst, wenn du das Objekt mit new[] erzeugt hast.
Aber idr. sollte man die Speicherverwaltung eh mit SmartPointern kapseln, da gerade durch Exceptions sonst leicht ein delete flöten gehen kann.
Hier ein bisschen was zum lesen, wenn du das obere nicht verstehst oder mehr Infos haben willst:
http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=auto_ptr#Answ
http://www.boost.org/libs/smart_ptr/smart_ptr.htmhttp://www.gotw.ca/gotw/009.htm
http://www.gotw.ca/gotw/010.htm...
-
Das ist richtig. Wenn du jedoch "Fremd"-Code verwendest, kann es bei schlechtem Design
so sein das du Speicher freigeben musst den andere allokiert haben. So etwas sollte aber in JEDEM Fall dokumentiert sein.
mfg JJ
-
Ach ja und noch ne Frage. Ist das korrekt so...?
template<class T, int n> class Foo { private: Bar<T>* list[n]; };
a) Kann ich hier Inline die Größe des Arrays mit n festlegen. Das Array liegt doch dann auf dem Stack und nicht auf dem Heap oder?
b) Bar<T>* bedeutet, dass das Array Pointer auf Objekte von Typ Bar<T> besitzt oder?
c) Wenn ich schreiben würde Bar<T>* *list[n]; dann wäre list ein Pointer auf ein Array, das Pointer auf Objekte vom Typ Bar<T> besitzt oder?Danke!
-
Stussy schrieb:
a) Kann ich hier Inline die Größe des Arrays mit n festlegen. Das Array liegt doch dann auf dem Stack und nicht auf dem Heap oder?
Ja
b) Bar<T>* bedeutet, dass das Array Pointer auf Objekte von Typ Bar<T> besitzt oder?
Ja
c) Wenn ich schreiben würde Bar<T>* *list[n]; dann wäre list ein Pointer auf ein Array, das Pointer auf Objekte vom Typ Bar<T> besitzt oder?
Nein
wenn Foo* a[n]; ein Array aus Zeigern ist, dann ist Foo** a[n] ein Array aus Zeigern auf Zeiger.Ob du Foo* a; oder Foo *a; oder Foo * a; schreibst, ist egal. Leerzeichen kannst du setzen wie du lustig bist
-
[quote="Shade Of Mine"
dann ist Foo** a[n] ein Array aus Zeigern auf Zeiger.[/quote]Und a somit ein Zeiger auf ein Array von Zeigern, korrekt?
-
Stussy schrieb:
Und a somit ein Zeiger auf ein Array von Zeigern, korrekt?
Falsch, foo** (*)[a] wäre ein Zeiger auf ein Array von Zeigern auf Zeiger
-
Shlo schrieb:
Stussy schrieb:
Und a somit ein Zeiger auf ein Array von Zeigern, korrekt?
Falsch, foo** (*)[a] wäre ein Zeiger auf ein Array von Zeigern auf Zeiger
langsam wirds hier unrealistisch
-
otze schrieb:
Shlo schrieb:
Falsch, foo** (*)[a] wäre ein Zeiger auf ein Array von Zeigern auf Zeiger
langsam wirds hier unrealistisch
Schon klar
Aber ich möchte doch auch nur einen Zeiger auf ein Array, das Zeiger enthält. Das wäre dann so Foo* (*)a[size]. ISt das nun korrekt so? Das ist doch aber gar nicht so unrealistisch oder?
-
Es gibt drei Möglichkeiten:
int* a[5]; //ohne Größenangabe int** p = a; //mit int* (*p)[5] = &a; //oder Referenz auf ein Array von Zeigern int* (&p)[5] = a;
otze schrieb:
langsam wirds hier unrealistisch
Wieso unrealistisch?
Das ist korrektes C++
int** a[4]; int** (*p)[4] = &a;