2011-01-01 25 views
5

Giả sử tôi có mã được cung cấp trong this tutorial.Trong V8, làm cách nào để loại bỏ các đối tượng C++ được bao bọc sau khi các đối tác JavaScript của chúng được thu thập rác?

Làm cách nào để sửa đổi điều này để đối tượng Point C++ được tạo có hàm hủy và được xóa khỏi bộ nhớ khi GC cho V8 phá hủy trình bao bọc JavaScript?

+0

thể trùng lặp của [Làm thế nào để bạn giải phóng một đối tượng C++ bọc khi liên quan đến đối tượng Javascript là thu gom rác thải trong động cơ V8?] (Http: //stackoverflow.com/questions/173366/how-do-you-free-a-wrapped-c-object-when-associated-javascript-object-is-garbag) –

Trả lời

6

Bạn muốn tạo một xử lý ổn định và làm cho nó yếu (v8 :: Persistent :: MakeWeak (dữ liệu, cb)). Trong callback bạn có thể xóa đối tượng C++. Như thường lệ với một bộ thu gom rác, thời gian chính xác mà khả năng tiếp cận yếu sẽ được xác định phụ thuộc vào thời điểm thực hiện GC. Do đó, tài nguyên gốc có thể được giải phóng muộn hơn bạn mong đợi. Bạn có thể thông báo cho V8 về số lượng tài nguyên gốc bạn đang nắm giữ (v8 :: AdjustAmountOfExternalAllocatedMemory).

nút của "ObjectWrap" đóng gói có nguồn gốc hai chiều/ánh xạ đối tượng JS và callback yếu: https://github.com/ry/node/blob/master/src/node_object_wrap.h

+1

Đảm bảo bạn gọi Dispose trên Handle Persistent hoặc bạn sẽ bị rò rỉ bộ nhớ. Chỉ cần dành một vài giờ theo dõi mà xuống trong mã của tôi, cuối cùng được sử dụng các cuộc gọi ClearWeak(), Dispose(), Clear() giống như destructor bọc Object sử dụng và nó cố định nó. – PherricOxide

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