2013-10-18 78 views
5

分配何時Lua的GC存儲用C與刪除內存lua_newuserdata函數

void *lua_newuserdata (lua_State *L, size_t size); 

分配呢? 當Lua中沒有提及它時,或者我必須注意刪除它嗎?

+0

我不認爲在C中存在垃圾收集這樣的事情,但我不知道Lua足以知道它發生了什麼事情。 – Eregrith

回答

6

分配給lua_newuserdata的內存在沒有引用時釋放裏面的 Lua。這是垃圾收集的工作原理。有重要的後果:

  1. 沒有必要釋放你的C程序中的內存。無需擔心完全釋放它。

  2. 不要釋放該內存。

  3. 不要在C程序中存儲指向該內存的指針,並假定它永遠有效。

  4. 如果你想使用該指針,請確保在Lua中有對它的引用。

換句話說,調用lua_newuserdata後,你需要在一些地方保存在Lua(一個全局變量,一個表項,函數的upvalue),其用戶數據值,如果你要在你的C程序中用到它。否則在你回到Lua後它可能會消失。

2

Lua的確分配了內存,但並沒有給你分配內存的所有權。所以簡短的回答是:不,不要釋放由Lua分配的內存。

7

lua_newuserdata分配內存但不給它C的所有權。你可以使用它,因爲你認爲合適,但不應該釋放它;一旦沒有更多的用戶數據對象引用,它將被lua自動釋放。

由此推論,如果你在C中長時間保持指針,你必須小心Lua在你還在使用它的時候不收集它。確保在從C完成使用之前,不要刪除所有對用戶數據的Lua引用 - 或者相反,使用__gc元方法確保C在收集對象時得到通知。