2012-06-16 45 views
12

Tôi có đối tượng gốc (C++) có một con trỏ gcroot đến một đối tượng được quản lý (C#).Các trình phá hủy gốc và được quản lý

class SomeNativeClass { 
    gcroot<SomeManagedClass ^> managedClass; 
}; 

Câu hỏi Khi tôi xóa một trường hợp mẹ đẻ của lớp này trong mã nguồn gốc delete(someNativeClass) mà tôi giao trước đây, các trường hợp managedClass sẽ nhận được thu gom rác thải hay tôi nên xóa một cách rõ ràng (trong destructor mẹ đẻ) cũng ?

+2

Bạn không thể xóa đối tượng được quản lý, chỉ người thu gom rác mới có thể thực hiện điều đó. Nếu lớp C# triển khai IDisposable thì có lẽ bạn sẽ muốn thực hiện một nỗ lực để gọi phương thức Dispose() của nó. –

+0

@HansPassant Cảm ơn câu trả lời của bạn. Nếu chỉ xóa các đối tượng bản địa và quản lý không được tham chiếu ở bất cứ nơi nào khác, nó sẽ được thu gom rác? – GETah

Trả lời

9

Nếu chỉ xóa đối tượng gốc và đối tượng được quản lý không được tham chiếu ở bất kỳ nơi nào khác, đó có phải là rác được thu thập không?

Đó là bản chất của việc thu gom rác thải. Người thu hủy phá hủy một đối tượng khi nó không thể tìm thấy một tham chiếu đến đối tượng. Nó được thực hiện một chút khác biệt khi bạn sử dụng gcroot <> lớp mẫu, cách "bình thường" mà trình thu thập tìm thấy các tham chiếu đến các đối tượng được quản lý bằng cách khám phá chúng trong sổ đăng ký cpu và ngăn xếp mã được quản lý và vùng được quản lý. Điều đó không thể hoạt động trong mã gốc, lớp gcroot <> giúp ích.

gcroot <> hàm tạo cuộc gọi GCHandle :: Alloc() để cấp phát tham chiếu rõ ràng cho đối tượng. Destructor của nó gọi GCHandle :: Free() để loại bỏ nó. Việc có thể phân bổ các "điều khiển theo dõi" này là một cơ chế thứ cấp trong CLR, nó duy trì một bảng cho chúng mà trình thu thập tham khảo ngoài các tham chiếu mà nó tìm thấy.

Hiệu ứng ròng là khi trình phá hủy lớp của bạn chạy, nó sẽ tự động gọi gcroot <> destructor. Tham chiếu đối tượng đã biến mất. Nếu đó là tham chiếu duy nhất, rất có khả năng trong trường hợp này, thì việc thu gom rác tiếp theo sẽ phá hủy đối tượng. Tự động. Một lát sau.

+0

+1 Cảm ơn câu trả lời chi tiết – GETah

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