2017-05-16 1 views
-1

Ich liebe, dass JavaScript locker eingegeben wird.Führt das Ändern des Typs einer Variablen zu Speicherlecks?

Um ehrlich zu sein, denke ich selten über Speicherverwaltung, wenn Sie es verwenden.

Wenn eine Variable erstellt wird, sogar in JS, wird eine bestimmte Menge an Speicher für diese Variable zugewiesen. Variablen in JavaScript sind jedoch veränderbar. Was passiert, wenn eine Variable von einem Typ in einen anderen geändert wird?

Zum Beispiel:

var a = "hello world"; //~22 bytes 
a = 10;    //now 'a' is only 8 bytes 

Sie die restlichen 14 Bytes erhalten Müll gesammelt? Oder verursacht dies ein Speicherleck?

+0

Seltsame Frage. Wenn einfacher Code wie dieser ein Speicherleck verursacht, wie könnten Sie die meisten Websites verwenden, ohne dass Ihr Computer stirbt? –

+0

Nein. Variablen in im Wesentlichen all diesen Sprachen sind als Referenzen auf typisierte Speicherpuffer im Heap implementiert. Wenn der Wert geändert wird, wird die Variable einfach so geändert, dass sie auf ein anderes Objekt im Heap verweist. Wenn die Variable die letzte Referenz auf das Objekt war, sollte der Verweis-/Speicherbereinigungsmechanismus, der verwendet wird, schließlich diesen Heap-Speicher freigeben und freigeben. – Linuxios

+0

Die einzige Ausnahme zu dem oben genannten besteht darin, dass in einigen Sprachen Laufzeiten einfache Typen mit festen Größen wie boolean, Ganzzahlen und Gleitkommazahlen direkt "in" der Variablen gespeichert werden; h. das Feld, das normalerweise den Zeiger auf den Heap enthalten würde, enthält die Daten und ist irgendwie als solches markiert. – Linuxios

Antwort

1

Nein. Variablen in praktisch allen solchen Sprachen werden als Referenzen auf typisierte Speicherpuffer im Heap implementiert. Wenn der Wert geändert wird, wird die Variable einfach so geändert, dass sie auf ein anderes Objekt im Heap verweist. Wenn die Variable die letzte Referenz auf das Objekt war, sollte der Verweis-/Speicherbereinigungsmechanismus, der verwendet wird, schließlich diesen Heap-Speicher freigeben und freigeben.

Die einzige Ausnahme zu dem oben genannten ist, dass in einigen Sprachen Laufzeiten einfache Typen mit festen Größen wie booleans, Ganzzahlen und Gleitkommazahlen direkt "in" der Variablen gespeichert werden; h. das Feld, das normalerweise den Zeiger auf den Heap enthalten würde, enthält die Daten und ist irgendwie als solches markiert.

1

Nein, es sind keine Speicherlecks in die JavaScript-Sprache integriert (die keine Speicherzuweisungen für die Speicherzuweisung enthält).

Wenn eine Implementierung einen Speicherverlust auf dem angezeigten Code hat, ist es (sehr) fehlerhaft.

Höchstwahrscheinlich wird ein Objekt in der zugrunde liegenden Engine vollständig durch ein neues Objekt ersetzt, und dem Ersatzobjekt wird eine logische "Referenz" zugewiesen.

+0

Es gibt tatsächlich Speicherlecks in JavaScript. Das heißt, ich denke, Ihre Antwort ist wahrscheinlich richtig, dass die Variable ersetzt und an anderer Stelle erstellt wird. Hast du zufällig eine Referenz dafür? – itcropper

+0

Nein, es gibt keine Speicherlecks in JavaScript. Auch hier hat die Sprache nicht einmal das Konzept der Speicherzuweisung. Und ein undichter Motor ist (offensichtlich) fehlerhaft. Ich denke, Sie beziehen sich auf das, was passiert, wenn Sie eine Zirkelreferenz erstellen; Das ist ein Fehler in Ihrem Programm, nicht in der Sprache! –

+0

Und nein, ich habe keine Referenz; Das Entpacken, wie Compiler und JavaScript-Engines funktionieren, geht weit über den Umfang einer einzelnen Stack Overflow-Antwort hinaus. Daher "höchstwahrscheinlich".Es genügt zu sagen, dass das Zuweisen einer Variablen in JavaScript keinen Speicherverlust verursacht, und ich weiß nicht, warum Sie meinen, dass dies der Fall wäre. –

Verwandte Themen