2011-08-23 35 views
5

Tôi bị rò rỉ bộ nhớ trong phần Lua của ứng dụng. Vì lý do gì, đối tượng của tôi không bị xóa khi cần (ngay cả khi tôi gọi collectgarbage("collect")). Tôi cho rằng điều này có nghĩa là tôi có một tài liệu tham khảo lơ lửng ở đâu đó.Tìm tất cả các tham chiếu đến một đối tượng trong Lua

Vậy làm cách nào để có được danh sách các tham chiếu khác nhau cho một đối tượng cư trú? Ví dụ:

obj = MyObject() 
ref = obj 
tbl = {obj} 
obj = nil 
print(getreferences(obj)) -- should print something like _G.ref, _G.tbl[1] 

Tôi chỉ cần viết chức năng của riêng mình cho việc này, nhưng không thể tìm thấy các tham chiếu có chứa bên trong bao đóng. Lời khuyên nào?

+0

Bàn và đối tượng Lua không có tên. Vì vậy, tất cả các bạn sẽ nhận được là một danh sách các địa chỉ bảng, mà sẽ không được rất hữu ích. –

+0

@Nicol Bolas: Điều đó không hoàn toàn đúng. Nếu tôi bắt đầu ở mức cao, _G và sử dụng cặp (_G) để làm việc theo cách của tôi cho đến khi tôi tìm thấy khóa có giá trị khớp với những gì tôi đang tìm kiếm, tôi sẽ được cung cấp đường dẫn đầy đủ đến tham chiếu. Tôi chỉ không biết cách truy cập các giá trị cư trú trong vòng bao đóng từ bên ngoài đóng cửa. – Ponkadoodle

+1

Và nếu bảng là một _key_ thì sao? Đó là mã Lua hoàn toàn hợp pháp. Điều gì sẽ xảy ra nếu khóa của bảng không phải là một chuỗi? Điều gì sẽ xảy ra nếu nó không nằm trong bảng toàn cầu _at all_, cũng hoàn toàn có thể. Nó có thể nằm trong registry, hoặc nó có thể ở trong môi trường cục bộ của một hàm. Lua không yêu cầu tất cả các đối tượng có thể truy cập từ '_G'. –

Trả lời

3

Có một công cụ để di chuyển toàn bộ vũ trụ Lua. Xem http://lua-users.org/lists/lua-l/2006-07/msg00110.html

+0

Xem câu hỏi của tôi ở đây: http://stackoverflow.com/questions/14531901/is-my-lua-object-being-collected . Tôi tin rằng tập lệnh này sẽ không tìm thấy tất cả các tham chiếu đến một đối tượng. Ít nhất, nó không làm như vậy đối với tôi. Sử dụng nó một cách thận trọng. – Watusimoto

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