9
votes

Gestion de la mémoire Lua

Comment pouvons-nous libérer la pile Lua?

lua

2 commentaires

Pourquoi le bowvote? Ceci est définitivement lié à la programmation et je ne sais aucun problème avec la langue utilisée ou quoi que ce soit.


Qu'essayez-vous d'atteindre?


7 Réponses :



3
votes

Fondamentalement, la seule façon dont je sais pour libérer toute la pile Lua appelle Lua_Close sur l'instance Lua_State.


0 commentaires

15
votes

Pourquoi voulez-vous faire cela?

Si vous devez supprimer tous les éléments de la pile Lua, vous devez appeler lua_settop (L, 0) . Pour quote manuel :

void lua_settop (lua_state * l, int index);

Accepte tout index acceptable, 0 et définit la pile haut sur cet index. Si le nouveau sommet est plus grand que l'ancien, les nouveaux éléments sont remplis de nil. Si l'index est 0, tous les éléments de pile sont supprimés.

Cela soumettrait tous les éléments de la collecte des ordures. Appelez lua_gc (lua_gc_collect) après la collecte des ordures. Si vous avez vraiment besoin de collecter toutes les ordures collectables, appelez-la dans une boucle, jusqu'à ce que la valeur, renvoyée par lua_gc (lua_gccount) , resterait la même chose.

Notez que (AFAIK) Vous ne pouvez pas vous libérer de l'espace, alloué à la pile elle-même - sauf si, bien sûr, vous appelez lua_close () . .


1 commentaires

Je pense que vous voulez dire: Lua_settop (L, 0).



0
votes

Si vous avez mis par ex. 5 éléments sur la pile dont vous n'avez plus besoin, vous pouvez les supprimer avec lua_pop a >:

lua_pop(l, 5) -- removes the 5 topmost elements from the stack


0 commentaires

0
votes

Dans certains cas, vous n'êtes pas obligé. Par exemple, dans une fonction, vous pouvez appuyer sur 5 valeurs, puis renvoyez 3, pour dire que vous retournez 3 valeurs. Les valeurs supplémentaires 2 seront libérées automatiquement, car la taille de la pile est ajustée à ce que vous avez dit. (Cela évite les erreurs où vous dites que vous retournez un nombre différent de valeurs que vous avez réellement poussé.)


0 commentaires

0
votes

Si vous utilisez une table ou une matrice en tant que stockage variable, vous pouvez définir la clé sur nul en faisant

a[variable key]=nil


0 commentaires

1
votes

lua_settop (l, 0); devrait fonctionner. Appelez lua_gc () alors. Cela ne libérera pas tout l'espace, Toute la pile entière sera effacée lorsque vous fermerez l'état Lua.


0 commentaires