Khi cung cấp các cuộc gọi lại cho JavaScript bằng cách sử dụng Closures , cách nào tốt hơn để giải quyết việc tránh giải phóng chúng? Các hướng dẫn wasm-bindgen gợi ý sử dụng .forget
, nhưng thừa nhận rằng đó là về cơ bản bị rò rỉ bộ nhớ.
Thông thường chúng tôi sẽ lưu trữ tay cầm để sau đó bị bỏ rơi vào một thời điểm thích hợp nhưng hiện tại chúng tôi muốn nó là một trình xử lý toàn cầu vì vậy chúng tôi sử dụng
forget
phương pháp để thả nó mà không làm mất hiệu lực đóng cửa. Lưu ý rằng đây là bộ nhớ bị rò rỉ trong Rust, vì vậy điều này nên được thực hiện một cách thận trọng!
Nó gợi ý về việc lưu trữ các bao đóng cho đến khi nó thích hợp để được thả. Trong câu trả lời của alexcrichton cho một câu hỏi trước đó , anh ta đề cập đến ...
[...] nếu nó [...] chỉ được gọi một lần, thì bạn có thể sử dụng
Rc
/RefCell
để thảClosure
bên trong bao đóng (sử dụng một số shenanigans biến đổi bên trong)
Nhưng anh ta không cung cấp một ví dụ về phương pháp này.
Các tài liệu Đóng cửa cũng đưa ra một ví dụ về trả lại tham chiếu đến việc đóng cửa với bối cảnh hoạt Javascript để cho nó xử lý khi để giải phóng tài liệu tham khảo.
Nếu chúng ta thả
cb
ở đây, nó sẽ gây ra một ngoại lệ bất cứ khi nào khoảng thời gian trôi qua. Thay vào đó, chúng tôi trả lại tay cầm của chúng tôi trở lại JS để JS có thể quyết định khi nào hủy khoảng thời gian và phân bổ việc đóng cửa.
Tôi cũng tưởng tượng có nhiều cách để sử dụng các tính năng như thời gian sống hoặc #[wasm_bindgen]
macro trên một chức năng công cộng để tránh vấn đề này, nhưng tôi gặp khó khăn khi tìm ra cách thực hiện theo cách đó.
Câu hỏi của tôi là, các lựa chọn thay thế nào để sử dụng .forget
với các bao đóng được chuyển lại cho JavaScript từ Rust và tôi có thể xem một số ví dụ đơn giản về mỗi tùy chọn đang sử dụng không?