Speicherverwaltung bei Variablen

Hallo,

im Umgang mit Basic und Pascal auf 386er Rechner hatte ich gelernt, sparsam mit Hauptspeicher und Rechenleistung umzugehen. Heute spielt das bei kleinen Anwendungen zwar kaum mehr eine Rolle, aber es würde mich schon interessieren, wie es sich mit der Freigabe des durch Variablen belegten Speicherplatzes verhält.

Wenn ich z.B. „var i = 5;“ oder „var a = new Array(1, 2, 3)“ schreibe, wird jeweils entsprechender Speicherplatz allokiert. Wird dieser wieder freigegeben, wenn ich daraufhin „i = undefined;“ oder „a = undefined;“ notiere? Oder wird bei „a = 1;“ wenigstens der belegte Speicherplatz soweit zurückgestutzt, daß es für die Eins ausreicht, aber nicht mehr das vormalige Array umfasst?

Was passiert, wenn ich einen Pointer auf einen Wert habe, z.B. bei mehrdimensionalen Arrays? Überwacht JavaScript, ob es noch aktive Referenzen auf diesen Wert gibt und gibt den Speicher selbst wieder frei, sowie die letzte Referenz gelöscht wird?

Ist „delete i;“ gleichzusetzen mit „i = undefined;“ oder „i = null;“?

Wie sieht das Ganze in Perl aus? Ist es da genauso?

Danke,
Kristian

Hallo,

also erstmal mur man zwischen reference-basierten (wie z.B. Java, JavaScript) und instance-basierten Sprachen (wie C/C++) unterscheiden. Eine Reference allokiert keinen Speicher und kann ohne ein korektes Object auf das es berweisst, nicht alleine nicht existieren. Der eingebaute Garbage-Collector sorgt selbst dafür, dass eine Instance terminiert wird, wenn die Anzahl der References null wird. Bei den meisten instance-based Sprachen, wo Speicher auf dem Heap allokiert wird, muus man sich selbst um die Speicherverwaltung kümmern. Dies brauchst Du bei JS nicht machen.

var steht für sowas wie ein Variant type als Variable.
Wenn Du var a = 1; definiert und dann in JS typeof(a) aufrufst, dann wird von der Function „number“ als String zurückgeliefert. Bei dem Array wird dann „object“ geliefert und bei var a = null; liefert typeof(a) auch „object“ zurück. Es gibt noch mehr solche Typen, die typeof() liefert.

Ein weiterer Punkt spielt die Lifecycle. Innerhalb einer function wird der dort allokierte Speicher von Variablen wieder freigegeben. Diese wurden ja lokal in der function deklariert. Globale Variable werden erst beim Verlassen des ganzen Scripts terminiert, es sei denn (in beiden Fällen) von aussen hält irgend etwas noch eine Reference drauf.

Aber wie schon gesagt, wichtig ist zu verstehen, dass bei einer refernce-based Sprache wie JS kein Speicher bei einer Deklaration allokiert wird!

Ciao