2011-01-18 29 views
12

Khi chúng tôi phân tích đống bộ nhớ, sau 4 loại GC handle chúng tôi thường đi qua:Khái niệm đằng sau 'Xử lý GC được ghim' là gì?

  1. Yếu: - Một GC xử lý yếu sẽ không ngăn chặn các trường hợp nó tương ứng với từ được thu thập rác. Example, used by the System.WeakReference class instances.

  2. Bình thường: - Trình xử lý GC bình thường ngăn không cho trường hợp tương ứng bị thu gom rác. Example, used by the instances of strong references.

  3. RefCounted: - Một tay cầm tài liệu tham khảo tính GC được sử dụng trong nội bộ bởi thời gian chạy, example, when dealing with COM interfaces.

  4. Pinned: - Tại sao chúng ta cần loại GC xử lý? Là nó chỉ để tránh sự chuyển động của dụ rằng trong bộ nhớ hoặc is there any other notion behind this? I want to know the notion behind Pinned GC handle(with an example).

Edited cho Itay của câu trả lời: - Tôi có một tổ chức phi rỗng array- DiffCell [] [] đó là ràng buộc vào lưới dữ liệu trong WPF. Khi tôi đóng cửa sổ mà lưới dữ liệu này là hiện nay, trên đống Tôi thấy Pinned GC xử lý trỏ đến này trống DiffCell mảng thông qua object [] (xem ảnh chụp). I am not using any unsafe code. I am just setting ItemsSource of data grid to null before closing that window. So my question is who does pin this array on heap and why?

alt text

Trả lời

7

Chúng tôi cần điều này trong trường hợp chúng tôi sử dụng con trỏ.
Hãy tưởng tượng rằng bạn khai báo một con trỏ đến một vị trí bộ nhớ và bạn không ghim.
GC đôi khi di chuyển khối bộ nhớ đến các vị trí khác để con trỏ của bạn sẽ không hợp lệ.

ví dụ:

public unsafe void DoSomething(byte b) 
{ 
    byte * bp = &b; 
} 

này sẽ không biên dịch bởi vì bạn không khắc phục được vị trí bộ nhớ chứa byte.
Để ghim nó, bạn có thể sử dụng:

public unsafe void DoSomething(byte b) 
{ 
    fixed(byte * bp = &b) 
    { 
     //do something 
    } 
} 
+0

Xin cảm ơn! Vui lòng xem câu hỏi đã chỉnh sửa và cho tôi biết nhận xét của bạn về nó. –

+0

Tôi không thực sự biết làm thế nào WPF và ràng buộc làm việc vì vậy tôi sợ rằng tôi không thể giúp bạn ở đây. –

3

Dont quên GCHandle mà hỗ trợ ghim đối tượng (và lấy địa chỉ như một IntPtr). Các đối tượng ghim không dành riêng cho mã không an toàn (câu lệnh cố định).

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