Zeiger auf Array auf dem Heap nach inkrementieren löschen
-
Hallo Forum,
ich suche dringend Hilfe bei dem Löschen von Arrays
und zwar:
Cat* catArray = new Cat[10];
catArray (zeigt auf das erste Element)
catArray++ (zeigt auf das zweite Element)
catArray++ (zeigt auf das dritte Element)Nun möchte ich das ganze Array über den Pointer löschen
delete [] catArray (klappt nicht, weil die Adresse des Pointers verschoben wurde)
catArray = &catArray[0] (bei &catArray[0] bekomme ich irgendwie die Speicheraddresse des letzten Elements, also nicht von dem ersten Element. Warum?)
delete [] catArray; (geht auch nicht, weil catArray immer noch auf das dritte Element des Arrays zeigt)
Wie setze ich jetzt die Addresse des Arrays zurück ohne das Array wieder zu dekrementieren? Damit das Löschen endlich hinhaut...
-
Dann lösch eben (catArray-2). Oder viel besser: Mach so etwas gar nicht erst. Wozu soll das gut sein?
edit: Bist du zufällig Jürgen Wolf Schüler?
-
Gibt es keine Möglichkeit ohne catArray -2 zu löschen oder ohne sich die Adresse des ersten Elements in einer separaten Variable zu merken und dann zu löschen?
Das Problem ist, ich kenne die Zahl "2" nicht, weil ich das Array von einer anderen Funktion verändert bekomme. Das heißt, ich weiß es nicht, um wieviel mal das Array inkrementiert wurde...
-
Nein. Die Möglichkeit gibt es nicht. Aber dies alles sollte gar nicht notwendig sein. Warum benutzt du so wilde Sachen, anstatt z.B. std::vector?
-
Okay. Werden die Vector Elemente auf dem Stack oder auf dem Heap angelegt???
-
Auf dem Heap. Auf dem Stack sind dynamische Arrays nur sehr bedingt möglich.
-
goldenBoy schrieb:
Okay. Werden die Vector Elemente auf dem Stack oder auf dem Heap angelegt???
Gegenfrage: Wieso sollte das interessant sein? Es funktioniert eben einfach.
-
und es ist bei vector garantiert, dass die elemente hintereinander liegen. theoretisch könntest du also deine pointer spielereien trotzdem machen...
scheint meint, dass du ein ganz großer 3 sterne programmierer bist

-
Noch so allgemein:
Der Pointer, dem der Rückgabewert vonnewzugewiesen wurde, sollte nie vor der Verwendung vondeleteverändert werden. Wenn du nun, wie gesagt, inkrementieren möchtest, erstellst du eben einen zweiten Zeiger. Der Zweite dient als Iterator.
-
Indem man zwischen dem eigentlichen Array und dem Iterator dafür unterscheidet:
Cat * const cat_array = new Cat[10]; Cat * cat_iterator = cat_array; ++cat_iterator; ++cat_iterator; //... delete cat_array;Eigentlich ist das auch bei Standardlib-Containern gang und gäbe, daher verstehe ich den Aufschrei nicht so ganz.
-
Das ist für mich interessant, weil ich tausende von Objekten im Vector speichern will. Und vielleicht ist auf dem Stack der Speicher zu knapp.
Also vector speichert von Haus aus alle Elemente auf dem Heap an. Und man kann den Speicher auch explizit mit dem Clean Befehl freigeben, richtig?
Welche Vorteile hat man, wenn man den Vector (Vector pointer) direkt auf dem Heap anlegt?
-
EOutOfResources schrieb:
Noch so allgemein:
Der Pointer, dem der Rückgabewert vonnewzugewiesen wurde, sollte nie vor der Verwendung vondeleteverändert werden. Wenn du nun, wie gesagt, inkrementieren möchtest, erstellst du eben einen zweiten Zeiger. Der Zweite dient als Iterator.danke für den Tipp!
-
Welche Vorteile hat man, wenn man den Vector (Vector pointer) direkt auf dem Heap anlegt?
Keine. Nur Nachteile.
-
goldenBoy schrieb:
Also vector speichert von Haus aus alle Elemente auf dem Heap an. Und man kann den Speicher auch explizit mit dem Clean Befehl freigeben, richtig?
vector kennt kein clean, aber es gibt andere Befehle die ähnliches machen. Guck eben in einer Referenz nach. Der vector verwaltet seinen Speicher vollständig selber. Wenn du einen vector explizit dazu zwingen willst, seinen kompletten Speicher freizugeben (normalerweise keine gute Idee!), dann such mal nach Clear-and-minimize
Welche Vorteile hat man, wenn man den Vector (Vector pointer) direkt auf dem Heap anlegt?
Den vector selber auf dem Heap? Die gleichen Vorteile wie bei allen Heapvariablen: Keine nennenswerten, dafür ein paar Nachteile. Man sollte schon extrem gute Gründe dafür haben, z.B. ganz besondere Anforderungen an die Lebenszeit des Objekts.
-
Danke an alle für die Hilfe
-
Oder Multithreading.
-
Tachyon schrieb:
Indem man zwischen dem eigentlichen Array und dem Iterator dafür unterscheidet:
Cat * const cat_array = new Cat[10]; Cat * cat_iterator = cat_array; ++cat_iterator; ++cat_iterator; //... delete cat_array;Eigentlich ist das auch bei Standardlib-Containern gang und gäbe, daher verstehe ich den Aufschrei nicht so ganz.
Kurze Frage: Es müsste doch
delete[] cat_arrayheißen oder nicht?
Lg freeG
EDIT:
Was erhalte ich eigentlich zurück, wenn ich wie der TE einen Zeiger habe und dort den Indexoperator anwende?
-
fr33g schrieb:
Es müsste doch
delete[] cat_arrayheißen oder nicht?
Ja.
fr33g schrieb:
Was erhalte ich eigentlich zurück, wenn ich wie der TE einen Zeiger habe und dort den Indexoperator anwende?
Einen Zeiger auf n Elemente weiter (wie der
+-Operator).EDIT: Natürlich
+-Operator.
-
fr33g schrieb:
Kurze Frage: Es müsste doch
delete[] cat_arrayheißen oder nicht?
Ja, absolut richtig.
fr33g schrieb:
Was erhalte ich eigentlich zurück, wenn ich wie der TE einen Zeiger habe und dort den Indexoperator anwende?
a[3]ist äquivalent mit*(a+3)ist äquivalent mit3[a]ist äquivalent mit*(3+a).
-
Vielen Dank euch beiden, jetzt ist es mir wieder klar

Lg freeG