2009-08-06 37 views
9

Làm cách nào tôi có thể giải phóng ngăn xếp lua?quản lý bộ nhớ lua

+3

Tại sao bạn nên downvote? Điều này chắc chắn là lập trình liên quan và tôi không có bất kỳ vấn đề với ngôn ngữ được sử dụng hoặc bất cứ điều gì. –

+1

* ngôn ngữ như tiếng Anh –

+0

Bạn đang cố gắng đạt được điều gì? – lhf

Trả lời

2

Tôi nghĩ bạn cần lua_remove? Tôi chỉ lướt qua hướng dẫn sử dụng, không chắc chắn nếu có một chức năng "rõ ràng toàn bộ ngăn xếp".

void lua_remove (lua_State *L, int index);

Loại bỏ các yếu tố ở các chỉ số có giá trị nhất định, chuyển xuống các yếu tố trên chỉ số này để lấp đầy khoảng trống. Không thể được gọi với một chỉ mục giả, vì một chỉ mục giả không phải là một vị trí ngăn xếp thực tế.

3

Về cơ bản, cách duy nhất tôi biết để giải phóng toàn bộ ngăn xếp lua là gọi lua_close trên cá thể lua_State.

15

Tại sao bạn muốn thực hiện việc này?

Nếu bạn cần xóa tất cả các phần tử trong ngăn xếp Lua, bạn nên gọi lua_settop(L, 0). Để báo manual:

void lua_settop (lua_State *L, int index);

Chấp nhận bất kỳ chỉ số chấp nhận được, hoặc 0, và đặt ngăn xếp trên xuống chỉ số này. Nếu đầu mới lớn hơn cái cũ, thì các phần tử mới được lấp đầy bằng không. Nếu chỉ mục là 0, thì tất cả các phần tử ngăn xếp sẽ bị xóa.

Điều này sẽ tùy thuộc vào tất cả các yếu tố trong bộ sưu tập chồng lên thùng rác. Hãy gọi lua_gc(LUA_GC_COLLECT) sau đó để thực hiện thu gom rác. Nếu bạn thực sự cần thu thập tất cả rác thải thu thập được, hãy gọi nó trong một vòng lặp, cho đến khi giá trị, được trả về bởi lua_gc(LUA_GCCOUNT), sẽ giữ nguyên.

Lưu ý rằng (AFAIK) bạn không thể giải phóng dung lượng, được phân bổ cho ngăn xếp chính nó — trừ khi, tất nhiên, bạn gọi lua_close().

+0

Tôi nghĩ bạn có nghĩa là: lua_settop (L, 0). – Watusimoto

+0

Đã sửa lỗi, cảm ơn! –

0

Nếu bạn đã đặt ví dụ: 5 yếu tố trên stack bạn không còn cần, bạn có thể loại bỏ chúng với lua_pop:

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

Nếu không, bạn có thể muốn sử dụng lua_settop hoặc lua_remove như đã đề xuất.

Vì Lua tự động được thu thập rác, bộ nhớ thực sẽ bị mất một thời gian để giải phóng, vì vậy bạn cần gọi cho bộ thu gom rác một cách rõ ràng nếu bạn muốn xóa ngay lập tức.

0

Trong một số trường hợp, bạn không phải làm như vậy. Ví dụ, trong một hàm, bạn có thể đẩy 5 giá trị, sau đó trả về 3, để nói rằng bạn đang trả về 3 giá trị. Thêm 2 giá trị sẽ được giải phóng tự động, vì kích thước ngăn xếp được điều chỉnh theo những gì bạn nói. (Điều này tránh lỗi khi bạn nói rằng bạn đang trả về một số giá trị khác so với thực tế được đẩy.)

0

nếu bạn đang sử dụng một bảng hoặc mảng như lưu trữ biến bạn có thể thiết lập các khóa để nil bằng cách làm

a[variable key]=nil 

tôi đọc rằng nếu bạn gọi một chìa khóa mà không tồn tại trong bảng/mảng nó sẽ trả về nil, nil là trạng thái không có dữ liệu, biến hoặc trạng thái, tôi luôn giả định rằng, theo cách xóa hoặc xóa dữ liệu trong khóa

1

lua_settop(L, 0); sẽ hoạt động. Gọi lua_gc() sau đó. Điều này sẽ không giải phóng tất cả không gian, toàn bộ ngăn xếp sẽ bị xóa khi bạn đóng trạng thái lua.

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