Một đối tượng ghim là không thể di chuyển xung quanh bằng cách thu gom rác thải, nghĩa là địa chỉ của nó phải được giữ nguyên vì có người khác, thường là một số đoạn mã không được quản lý, phụ thuộc vào đối tượng là tại địa chỉ bộ nhớ xác định.
Thông thường bộ thu gom rác có quyền tự do di chuyển các đối tượng trong bộ nhớ. Trong mã được quản lý, vì trình thu gom rác có khả năng truy cập tất cả các tham chiếu, nó có thể tự do remap một đối tượng đến một vị trí khác và sau đó cập nhật tất cả các tham chiếu đến đối tượng đó để quá trình trong suốt với mã đang chạy. Bằng cách đó, GC có khả năng tổ chức tốt hơn bộ nhớ của chương trình và thu gọn nó nếu cần.
Khi đối tượng không được quản lý tương tác với mã của bạn (trong các phần không an toàn), một tình huống có thể phát sinh khi có một con trỏ ở đâu đó trong một đoạn mã và mã của bạn; mã của bạn đang được xử lý bởi một cuộc gọi COM bên ngoài. Bộ nhớ này không thể được ánh xạ lại vì cuộc gọi COM đang chờ đối tượng ở trong một địa chỉ cụ thể và do đó, nếu nó được di chuyển, GC sẽ không có bất kỳ cách nào để thông báo cho đối tượng COM về thay đổi đó, dẫn đến truy cập vi phạm hoặc tệ hơn.
Nguồn
2010-03-22 09:04:26
Nó không cần phải không an toàn. Như bạn thấy: Buffer = new byte [imageSize]; GCHandle gCBuffer = GCHandle.Alloc (Bộ đệm, GCHandleType.Pinned); – Pedro77
Tuy nhiên, nó đòi hỏi sự tin tưởng đầy đủ, tương đương với mã không an toàn. – usr