Verständnisfrage Dynamischer Speicher
-
Hallo zusammen
Warum ist es in C++ möglich/notwendig, Speicher manuell per "new" anzufordern? Ich kann in meinem Programm ja überall neue Variablen definieren?
Ist das ein altes C-Konstrukt, weil da nur am Anfang des Programms Speicher reserviert werden konnte?
Danke für eure Antworten!
-
Miness schrieb:
Warum ist es in C++ möglich/notwendig, Speicher manuell per "new" anzufordern? Ich kann in meinem Programm ja überall neue Variablen definieren?
Ja, überall, aber der Speicher lebt dann nur solange, wie die Funktion läuft, in der der Speicher angelegt wurde. new-Speicher lebt länger!!
Schau Dir mal eine verkettet Liste an. Eine Funktion, die der Liste einen neuen Satendatz anhängt, geht supi mit new, aber ohne?
-
OK, die Sache mit der verketteten Liste habe ich erst jetzt gesehen. Stimmt, da wird es wirklich schwierig ohne "new"...

Vielen Dank!
-
volkard schrieb:
Schau Dir mal eine verkettet Liste an. Eine Funktion, die der Liste einen neuen Satendatz anhängt, geht supi mit new, aber ohne?
Ginge auch.

Allerdings bei einer Liste eher weniger zu empfehlen und auf eine Art nicht dynamisch. Man könnte so viel Speicher, wie erwartet allozieren (statisch) und dann halt einfach Zeiger auf Teile holen und wieder zurückgeben. Bei einer Liste ist das natürlich Unsinn, aber es ginge.
-
drakon schrieb:
volkard schrieb:
Schau Dir mal eine verkettet Liste an. Eine Funktion, die der Liste einen neuen Satendatz anhängt, geht supi mit new, aber ohne?
Ginge auch.

Allerdings bei einer Liste eher weniger zu empfehlen und auf eine Art nicht dynamisch. Man könnte so viel Speicher, wie erwartet allozieren (statisch) und dann halt einfach Zeiger auf Teile holen und wieder zurückgeben. Bei einer Liste ist das natürlich Unsinn, aber es ginge.Aber dann ist es ja überhaupt keine Liste mehr, oder? ^^
-
drakon schrieb:
volkard schrieb:
Schau Dir mal eine verkettet Liste an. Eine Funktion, die der Liste einen neuen Satendatz anhängt, geht supi mit new, aber ohne?
Ginge auch.

Allerdings bei einer Liste eher weniger zu empfehlen und auf eine Art nicht dynamisch. Man könnte so viel Speicher, wie erwartet allozieren (statisch) und dann halt einfach Zeiger auf Teile holen und wieder zurückgeben. Bei einer Liste ist das natürlich Unsinn, aber es ginge.Klar!

So hab ich es ja in Basic auch gemacht.Allerdings kommr ich zu folgendem Problem:
Zu Programmstart allokiere ich viele Nodes, ein Gigabyte halt.
Und dann verkette ich flugs die Nodes in eine Freisppeicherliste.
Und dann baue ich mir eine Funktion, die mir einen neuen Node besorgt und eine, die einen verbrauchten Node wieder in die Freispeicherliste hängt.
Und die beiden nenne ich new und delete.
Und bin seltsamerweise, weil ich auf new/delete verzichtete, doch wieder dabei gelandet.
-
Doch. Eine Liste sagt ja nur, dass die Elemente aneinander hängen müssen, was du auch so ganz einfach machen kannst. Wie der Speicher verwaltet wird spielt keine Rolle für das Konzept einer Liste.
@volkard:
Klar wirst du bei so etwas ähnlichem landen, aber der Unterschied von dem normalem new und deinem ist ja, dass du bei dir dann nicht wirklich neuen Speichern vom OS anforderst und auch nicht dynamisch ist, sondern du bereits allen Speicher hast und dann lediglich ein paar Elemente benutzt. Der Rest ist dann "verschwendet".Abstrakt gesehen ist es exakt das gleiche korrekt. Darum spielt es für eine Liste ja auch keine Rolle.
-
Außerdem, wenn du Objekte von Klassen (als Zeiger) mit new anlegst, wird am Ende der Funktion nicht der Destruktor aufgerufen

Bei direkter Zuweisung (ohne Operatorüberladung) wird nur die Adresse kopiert :p
-
Ja. Und das hat volkard bereits in seinem ersten Post gesagt.