2010-06-13 47 views
2

一塊Lua userdata可能持有對Lua對象的引用嗎? (就像一張桌子,或另一塊用戶數據?)。基本上,我想知道的是:Lua userdata gc

我可以創建一段用戶數據,當gc運行時,用戶數據可以說:「嗨!我持有對這些其他對象的引用,標記他們也是。「

編輯:應對LHF:

假設我有:

struct Vertex { 
    double x, y, z; 
} 

struct Quaternion { 
    double w, x, y, z; 
} 

現在,我可以這樣做:

struct Foo { 
    Vertex v; 
    Quaternion q; 
} 

但假設相反,我想:

struct Bar { 
    Vertex *v; 
    Quaternion *q; 
} 

[ie假設Vertex & Quaternion是真正的大塊用戶數據]。

現在,假設我有一個使用userdata Vertex和userdata Quaternion的Lua用戶函數,並創建了一個userdata Bar(因爲我想保存空間,所以不需要userdata Foo) - 然後我需要以某種方式爲用戶數據Vertex */Quaternion *不被gc-ed。

+1

它似乎令人費解。你爲什麼想這樣做? – lhf 2010-06-14 00:49:35

+0

@lhf:上述編輯是否有意義? – anon 2010-06-14 08:43:49

+1

現在這是一個不同的問題。簡短的回答並不是混合使用兩種類型的內存管理:在C中顯式對Lua中的自動顯示。見諾曼的答案。 – lhf 2010-06-14 09:57:07

回答

4

lua用戶數據有可能持有對lua對象的引用嗎?

編號 userdata無法保存指向另一個Lua對象的指針。如果你想使用用戶數據來保持另一個Lua對象的存在,你必須使用弱表。羅伯託的書作爲section on how to do it

+0

「強大的表格」是當gc-ing時檢查關鍵字和值的表格。用戶數據是如何影響弱點的?你能解釋更多嗎? – anon 2010-06-14 08:38:48

+1

您將userdata與您嘗試保持活動的Lua值一起放入表中。羅伯託的書在線並解釋了這一切。 – 2010-06-14 17:10:02

+0

爲什麼我會用弱表而不是強表呢? – anon 2010-06-14 23:55:06

0

過去一段時間,因爲我做了任何與盧阿。我認爲如果引用的數據是由lua機器創建的,那麼它會自行清理它。否則,您必須等待C代碼中的gc回調並自行釋放內存。