为什么非托管结构不能成为托管类的成员?

时间:2012-05-09 20:01:00

标签: interop c++-cli unmanaged

我知道在C ++ / CLI中,在定义托管类时不能使用非托管类型:

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

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

我不明白为什么。 Unmanaged只是一个本机类型的集合 - 它的大小是已知的,当然它(我的意思是定义它的内存块)将随着'{1的'内存块'移动在'托管堆'中,并且元数据中存储的任何偏移都将保持有效,不是吗?就像声明了整数或浮点数一样?

为什么 我们不能混用类型吗?

1 个答案:

答案 0 :(得分:16)

混合型实际上是指混合型内存模型。非托管类型进入堆,托管类型进入垃圾收集堆,因此当您在托管中嵌入非托管类型时,它将需要两个堆上的内存,这就是您使用指针执行此类操作的原因。指针是受管理的,它指向的值不是。

我自己很好奇,所以我收集了谷歌,发现了这一点。

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

盖伊似乎知道他在说什么。

虽然好问题......