[erledigt]new und delete - ich kanns, verstehs aber nicht -.-
-
Hallo Community,
ich habe da eine Frage, was
newunddeleteangeht. Naja, es ist eher eine allgemeine Frage: Zu was gebraucht man das überhaupt?! Ja schön, um Speicher auf dem Heap zu reservieren - weiß ich auch - jedoch wozu, wann oder warum brauch man das in einem Programm? Ich komme da einfach nicht mehr weiter, mit dem was im Buch steht und suche nach einer einfachen Dummie-Erklärung.Bei was macht
newunddeleteSinn?
Was für Nachteile hätte man, wenn man das nicht benutzen würde?Wenn ich
newunddeletenicht verstehe kann ich nicht fortfahren an meinem Buch zu lernen (weil das für die nächsten Listings nötig ist).PS: Die Makros
newunddeletehabe ich vor 1-2 Jahren schon mal versucht zu erlernen - mit Misserfolg. Das frustrierte mich sogar so sehr, dass ich für ein halbes Jahr mein C++-Buch in die Ecke schmiss und mit dem, was ich bisher gelernt habe über die Runden zu kommen. -.-Hoffe, dass mir einer helfen kann, damit ich so schnell wie Möglich weiter am Buch lernen kann. Danke jeder Antwort...
Liebe verzweifelte Grüße,
Spiri
-
Das macht bei allem Sinn, wo man erst zur Laufzeit weiß, wieviel Speicher man denn nun braucht oder wieviele Objekte von bestimmten Typ etc. Beispielsweise könntest du eine Datei komplett in den Speicher lesen wollen, du kennst die Datei aber während des Schreibens des Programms noch nicht so genau, weißt daher also auch nicht, wieviel Speicher du dafür benötigst.
Also fragst du beim Betriebssystem zur Laufzeit, wie groß die Datei ist, forderst mit new genügend Speicher an und lädst die Datei dann in diesen Speicherbereich.
-
Hmm, so langsam geht mir ein Licht auf. Ich versuchs mal in eigenen Worten zu fassen:
Wenn man zum Beispiel ein Array hat und nicht weiß, wie viele Felder es braucht, so gebraucht man new und delete um es im Laufe des Programms herauszufinden?
Mal ganz grob erklärt...
-
Ein Beispiel aus der Praxis:
Ich habe eine Klasse Sprite welche die Daten für ein Quadrat in OpenGL enthält. Wenn ich diese in einen STL-Container wie list oder vector stecke, werden die Daten kopiert. Da ich davon zur Laufzeit aber eine endliche Menge N habe, das in den Tausender-Bereich gehen kann (Stichwort: Partikel), dann ist das ganz schön langsam.
Erzeuge ich die Daten auf dem Heap und merk mir nur die Pointer oder erzeuge eine einfach verlinkte Liste, dann ist das eine Zeit- und Speichereinsparung. Und ab einer gewissen Menge merkt man das.
Ausserdem werden auf dem Heap erzeugte Objekte beim verlassen einer Funktion nicht zertört.void foobar() { MyClass A; MyClass* B = new MyClass(); // A wird hier jetzt zerstört, B lebt weiter (und würde in diesem fall auch ein speicherleck erzeugen da es nie zerstört wird) };Wenn man zum Beispiel ein Array hat und nicht weiß, wie viele Felder es braucht, so gebraucht man new und delete um es im Laufe des Programms herauszufinden?
Kommt fast hin:
void foobar(int size) { int myArray[size*5]; // <- geht nicht, gibt einen compilerfehler int *myArray = new int[size*5]; // <- funktioniert }
-
Minispiri schrieb:
Hmm, so langsam geht mir ein Licht auf. Ich versuchs mal in eigenen Worten zu fassen:
Wenn man zum Beispiel ein Array hat und nicht weiß, wie viele Felder es braucht, so gebraucht man new und delete um es im Laufe des Programms herauszufinden?
Mal ganz grob erklärt...
z.B. Ja. Nicht um herauszufinden wie viel, aber um genug Speicher anzufordern.
Sagen wir du hast eine Datei die du auslesen möchtest. Jede Zeile willst du in einem String-Array unterbringen. Nun könntest du dein Array 100 Zeilen groß machen, aber was, wenn die Datei mehr Zeilen hat? Dann könntest du die Zeilen zählen und danach einen Array mit passender Größe mit "new" erstellen ohne die Gefahr einen zu kleinen Arrays zu haben.
-
Hmmm, ich glaube ich habs jetzt einigermaßen verstanden.
Danke für die Antworten, werde mich dann aber wieder melden, falls wieder Unklarheiten auftreten sollten.