Array löschen
-
Die üblichen Probleme mit Zeigern und Pointer die wohl jeder am Anfang hat...
Ich erzeuge und lösche ein Array:
int *arr = new int[10]; delete [] arr;Ich erzeuge einen Zeiger *arr, und *arr ist Äquivalent zu arr[], richtig? Dh deswegen kann ich delete [] arr schreiben, aber warum kann ich dann nicht
delete *arr;Schreiben? Icb bekomme die Meldung, kann keine Objekte löschen, die keine Zeiger sind, was mich verwirrt, da ich ja einen Zeiger übergebe.
Und sind diese beiden Schreibweisen gleich
delete [] arr; delete [] &arr;Oder ist die Referenz von arr was anderes als der Zeiger?
Egal wie oft und wie lange ich über Pointer lese, wenn ich es anwende, gelangt alles wieder in einen großen Topf...
-
Ich erzeuge einen Zeiger *arr, und *arr ist Äquivalent zu arr[], richtig?
Ehm nein.
int arr[10]; int* ptr = arr; int = ptr[0];=> *arr == arr[0]
chreiben? Icb bekomme die Meldung, kann keine Objekte löschen, die keine Zeiger sind, was mich verwirrt, da ich ja einen Zeiger übergebe.
Ja s.o. ... du erhälst bei T arr[x]; *arr ein T zurück. T* = arr.
Oder ist die Referenz von arr was anderes als der Zeiger?
Ehm nein das eine ist ein Zeiger und das andere ein Zeiger auf einen Zeiger

delete [] arr; delete [] &arr;ist wie Apfel und Birne. Das eine ist korrekt und was das andere macht ... hmm ... sollte nicht gehen ^^
delete [] arr; delete &arr;
-
Ah, richtig *arr = arr[0].
Ich wundere mich nur, wir sollen ein Array bauen, was
so initialisiert wirdint *arr = new int[10];Und damit weiß ich automatisch auch, wo der erste wert reingehört, nämlich nach *arr, korrekt? Nach dem ich den Wert dann reingeschrieben habe, rück ich arr vor mit *arr += sizeof(int) und zeige auf den nächsten?
Wenn ja, wie merk ich denn, dass ich nicht mehr als 10 mal rücken sollte?
Ps:
delete &arr;kompiliert er anstandslos

-
(D)Evil schrieb:
Ehm nein.
int arr[10]; int* ptr = arr; int = ptr[0];=> *arr == arr[0]
Die dritte Zeile im Code ist ungültig und *arr == arr[0] gilt immer. Meintest Du *ptr == arr[0]?
delete [] arr; delete &arr;
Äh? Sollte die zweite Zeile gültig sein oder war das ein Negativbeispiel?

-
Interessanterweise kompiliert er ja
delete &arr;Und mach ich immernoch ein delete[] arr, wenn ich das Array als int *arr initialisiert habe?
Seltsam das alles
-
Seikilos schrieb:
Und damit weiß ich automatisch auch, wo der erste wert reingehört, nämlich nach *arr, korrekt? Nach dem ich den Wert dann reingeschrieben habe, rück ich arr vor mit *arr += sizeof(int) und zeige auf den nächsten?
Du solltest Array-Mitglieder auch mit der Array-Notation ansprechen. Also arr[0]..arr[9]. Dann weisst Du auch wohin Du rücken kannst.
Du kannst mit dem Zeiger natürlich auch vorrücken, aber das macht man mit arr += 1, da *arr das Element ist, mit *arr += 1 addierst Du etwas auf den Wert. Und Zeigerarithmetik arbeitet immer mit Typgrößen, deshalb brauchst Du kein sizeof.
Zum dritten solltest Du, wenn Du mit Zeigern drüberlaufen willst, eine Kopie von arr erstellen, denn sonst kannst Du den mit new angeforderten Bereich nicht mehr löschen, weil Du seine Startadresse verlierst.
Wenn ja, wie merk ich denn, dass ich nicht mehr als 10 mal rücken sollte?
Mit dem Gedächtnis des Computers -> Du musst Dir die Länge und die aktuelle Position merken, auf die eine oder andere Weise.
delete &arr;kompiliert er anstandslos

Kein Wunder, da delete auf einen Zeiger vollkommen gültig ist. Korrekt macht das diese Zeile dennoch nicht.
-
Seikilos schrieb:
Und mach ich immernoch ein delete[] arr, wenn ich das Array als int *arr initialisiert habe?
Seltsam das alles
Darauf gibt es eigentlich eine kurze Antwort: Wenn Du irgendwo Speicher mit new ...[] holst, gibst Du ihn mit delete[] wieder frei. Wenn der Zeiger mit int *arr definiert wurde heisst die Variable arr und muss mit delete[] arr gelöscht werden.
-
Ah alles müll, gibts doch nicht, ich hab die folgende h Datei bekommen:
class Polygon{ public: Polygon(int noOfVertices); ~Polygon(); void addVertex(int,int); int getNumberOfVertices(); private: int *xPts; int *yPts; int numberOfVertices; };Entweder ich bin so richtig dumm oder irgendwo hier fehlen noch ne Menge variablen.
Wenn man diese H Datei nicht verändern darf, dann funktioniert das doch nicht, oder irre ich mich da komplett? Ich muss also int Arrays mit *xPts benutzen, warum auch immer nicht mit [], aber wie soll addVertex bitte funktionieren? Ich weiß doch nicht wo ich bin und wenn ich in der Tat mit der Adresse immer weiter rücke kann ich nicht prüfen, ob ich die Grenze des Arrays erreicht habe, außer ich reduziere numOfVertices immer um 1 und gucke obs 0 ist, wobei dann der getter dieser Variable meht als Müll ist...Grrrrr
-
? Ehm hast du oben nicht aufgepasst?
int arr[10]; int* ptr = arr; int data_0 = ptr[0]; assert(data_0 == *arr);...
int* xPts = new int[num]; // ... delete [] xPts;...
-
Doch, war mir nur unsicher, wir hatten doch letztens eine Diskussion über delete...
