2009-06-17 8 views
3

[Ich habe die Lua Handbuch zu lesen, aber es nicht bieten solide Antworten.]Lua Garbage Collection von Tabellen, verschachtelte Tabellen

Sagen wir, ich habe eine Lua-Tabelle, als indiziertes Array handeln:

local myArray = {}; 
myArray[1] = "Foo"; 
myArray[2] = "Bar"; 

Wie kann ich diese Tabelle am besten entsorgen? Setze ich myArray einfach auf null? Oder muss ich durch Array iterieren und jedes indizierte Element auf Null setzen?

Ebenso lassen Sie uns sagen, ich habe ich habe eine Lua-Tabelle, als Wörterbuch handeln:

local myDictionary = {}; 
myDictionary["key1"] = "Foo"; 
myDictionary["key2"] = "Bar"; 

Kann ich nur gesetzt ‚myDictionary‘ auf Null, oder muss ich durchlaufen haben?

Schließlich, was mache ich, Memory-Management-weise, wo ich Tabellen verschachtelt habe? z.B.

local myNestedCollection = {}; 
myNestedCollection[1] = {1, 2, 3}; 
myNestedCollection[2] = {4, 5, 6}; 

Muss ich jede dieser Untertabellen durchlaufen und sie auf Null setzen? Danke für jede Hilfe.

Antwort

5

In den meisten GC wird ein Objekt gesammelt, wenn es keine Referenzen darauf gibt. Wenn Sie den Anfang Ihrer Referenzkette auf "Null" setzen, wird ein Verweis auf die untergeordneten Elemente entfernt. Wenn das der einzige Bezugspunkt ist, werden die Kinder gesammelt.

+0

Vielen Dank an SpliFF und Adam für Ihre Hilfe. – SirRatty

6

Es sollte ausreichen, nur die lokale Variable auf zu setzen; Sie müssen nicht alle Schlüssel durchlaufen und sie auf nil setzen. Gemäß this page verwendet Lua einen Mark-and-Sweep-Speicherbereinigungsalgorithmus. Sobald Sie Ihre lokale Variable auf nil setzen, werden die Schlüssel in ihrer Tabelle nicht mehr erreichbar, sodass sie vom Garbage Collector für die nächste Sammlung erfasst werden. Wenn diese Objekte ebenfalls Tabellen sind, werden ihre Schlüssel ebenfalls nicht erreichbar sein, sodass sie ebenfalls erfasst werden.