2011-08-14 67 views
5

Hãy nói rằng tôi có một lớp học như thế này:Cần giúp đỡ để hiểu thế nào luabind instantiates lớp

class A 
{ 
public: 
A(){} 
~A(){} 
}; 

Và tiếp xúc với Lua qua Luabind như thế này:

module(luaState) 
    [ 
     class_<A>("Foo") 
     .def(constructor<>()) 
    ]; 

Và cuối cùng nhanh chóng nó trong một kịch bản như thế này:

A = Foo(); 

'Trạng thái tồn tại' thực tế của A tại điểm đó là gì?

Ở đâu đó trong heap, và lua giữ một tham chiếu đến nó ở đâu đó? (hoặc một đối tượng :: luabind?)

Tôi có cảm giác rằng nó chỉ có thể là một con trỏ, như được phân bổ theo mới hoặc tương đương.

Tuy nhiên, tôi có thể liên kết các hàm với lua chấp nhận tham chiếu, như lua_doSomething(A & a) và những gì kết thúc trong đó sẽ có tham chiếu thực tế. Cấp cho tôi biết điều này rất có thể chỉ là luabind đi qua a*a, nhưng tôi không có ý tưởng nếu đó là cách nó xảy ra.

Lý do tôi yêu cầu điều này là để hiểu và dự đoán thời gian tồn tại của các đối tượng được diễn đạt trong một kịch bản tốt hơn một chút.

đó, và tôi là không chắc chắn nếu quyền sở hữu hoặc kiếp thay đổi nếu, thay vì phơi bày lớp để Lua như trên, tôi làm điều đó như thế này:

A * lua_CreateA() 
{ 
return new A(); 
} 

module(luaState) 
    [ 
     class_<A>("Foo") 
    ]; 


module(luaState) 
    [ 

    def("createA",&lua_CreateA) 

    ]; 

Và sử dụng nó như

A = createA(); 

Bởi logic tôi hiểu cho đến nay, trường hợp này sẽ yêu cầu tôi làm sạch vì tôi là người phân bổ một đối tượng mới, trừ khi gán như thế này cho luabind sẽ giống như làm nó với constructor bị ràng buộc.

Nói tóm lại, tôi thực sự thực sự bối rối về đời đối tượng và các công cụ ở đây ... Tôi googled cho các từ khóa liên quan đến điều này, nhưng tôi chỉ nhận được những thứ như thế http://www.gamedev.net/topic/525692-luabind-ownership-and-destruction/

Mà không phải là thực sự những gì tôi muốn biết. Tôi muốn hiểu cách cụ thể cách mọi thứ được xử lý đằng sau hậu trường liên quan đến phân bổ, khởi tạo, cuộc đời và tất cả những điều đó.

Trả lời

5

Tuổi thọ của đối tượng rất đơn giản với Luabind. Bạn không cần phải hiểu những chi tiết đẫm máu của những gì Luabind làm trong nội bộ để có được nó.

Lua sở hữu các đối tượng được tạo bởi Lua trực tiếp. Vì vậy, nếu bạn phân bổ một đối tượng với cú pháp hàm dựng trong Lua, đối tượng đó được sở hữu bởi Lua. Khi đối tượng không còn được tham chiếu trong Lua, GC Lua sẽ thu thập nó.

Nếu Lua được tham chiếu đến một đối tượng bằng bất kỳ phương tiện nào khác, thì Lua không không phải là sở hữu đối tượng đó trừ khi bạn chuyển quyền sở hữu cụ thể bằng chính sách chấp nhận của Luabind. Vì vậy, nếu bạn đang ràng buộc một hàm trả về một đối tượng cho Lua, như vậy bây giờ bạn mong đợi Lua quyết định khi đối tượng đó còn sống hay không, thì bạn cần sử dụng chính sách áp dụng.

Đoạn cuối cùng chỉ áp dụng cho tham chiếu thực tế (con trỏ trả về và loại tham chiếu). Nếu Lua được cấp bản sao của một đối tượng (thông qua giá trị trả về không tham chiếu hoặc con trỏ), thì Lua sẽ sở hữu bản sao của đối tượng đó.

Các vấn đề liên quan