2012-05-09 45 views
13

Tôi biết trong C++/CLI người ta không thể sử dụng các loại không được quản lý khi xác định một lớp học quản lý:Tại sao cấu trúc không được quản lý không phải là thành viên của một lớp được quản lý?

public struct Unmanaged 
{ 
    int x; 
    int y; 
}; 

public ref class Managed 
{ 
    int one; 
    Unmanaged two; //error C4368 
}; 

Tôi không hiểu tại sao mặc dù. Unmanaged chỉ đơn giản là một tập hợp các kiểu gốc - kích thước của nó được biết, chắc chắn nó (và nó có nghĩa là khối bộ nhớ định nghĩa nó) sẽ được di chuyển xung quanh với 'khối bộ nhớ' là Managed bên trong 'vùng được quản lý' và bất kỳ phần bù nào được lưu trữ trong siêu dữ liệu sẽ vẫn hợp lệ, phải không? Cũng giống như một số nguyên hoặc một phao được khai báo?

Tại sao chúng tôi không thể kết hợp các loại?

+0

Bạn mong đợi ai có thể trả lời một câu hỏi như vậy một cách có thẩm quyền? – ildjarn

+0

@ildjarn tốt, tôi đã chỉ đi kiểm tra mã nguồn C++/CLI và viết một câu trả lời hay ... owait –

+1

Tôi sợ tôi không hiểu; ai đó có nhiều kiến ​​thức về hoạt động C++/CLI hơn tôi? Khi thiết kế trình biên dịch, ai đó chắc chắn đã có giả định rằng tôi khẳng định trong bài viết của tôi (hoặc giả định là hoàn toàn sai!), Và sau đó nhận ra rằng đối với một số điều kiện nó không đúng, do đó lỗi - tôi chỉ tò mò về điều kiện đó là gì. Trong bài đăng trên blog, Tony đã liên kết nó đã được giải thích rằng việc phân bổ các kiểu gốc trên heap được quản lý không được phép ngăn người khác lạm dụng pin_ptr để trả về các 'phiên bản' đó thành mã không được quản lý. – sebf

Trả lời

15

Loại hỗn hợp thực sự đề cập đến các mẫu bộ nhớ hỗn hợp. Các kiểu quản lý không được quản lý, vì vậy khi bạn nhúng một kiểu không được quản lý trong một quản lý, nó sẽ yêu cầu bộ nhớ trên cả hai heap, đó là lý do tại sao bạn làm điều này với một con trỏ. Con trỏ được quản lý, giá trị nó trỏ tới không phải là.

Tôi đã tò mò bản thân mình, vì vậy tôi tập hợp lên google của tôi và tìm thấy điều này.

http://blogs.msdn.com/b/branbray/archive/2005/07/20/441099.aspx

Guy dường như biết những gì anh ấy đang nói đến.

Câu hỏi hay ...

+0

Có một số thông tin tuyệt vời trong bài đăng đó, cảm ơn bạn rất nhiều! Nó làm cho tôi tự hỏi có bao nhiêu đặc điểm ngôn ngữ khác đã được thiết kế chỉ để ngăn chặn các lập trình viên mắc sai lầm (tôi đếm một ít nhất trong C#, không rơi qua các trường hợp trong báo cáo chuyển đổi) – sebf

+1

Rất nhiều và chúng tôi, tôi: D cần nhiều hơn nữa –

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