为什么无法将未管理的结构体作为托管类的成员?

14

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

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

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

我不明白为什么会这样。 Unmanaged 只是本地类型的集合-它的大小是已知的,那么它(我指定义它的内存块)会随着 '托管堆' 内的 Managed 的 '内存块' 一起移动,元数据中存储的任何偏移量都将保持有效,就像声明整数或浮点数一样。

为什么我们不能混合类型?


你期望谁能够权威地回答这样的问题? - ildjarn
@ildjarn 嗯,我正准备查看C++/CLI源代码并写一篇好的答案...等等。 - Dagg Nabbit
1
我担心我不明白它; 有比我更了解C++/CLI的工作方式的人吗?在设计编译器时,肯定有人提出了我在帖子中所断言的相同假设(或者这个假设完全错误!),然后意识到对于某些条件它不成立,因此出现了错误 - 我只是好奇那个条件是什么。 在Tony链接的博客文章中,解释说禁止在托管堆上分配原生类型,以防止人们滥用pin_ptr将这些“实例”返回到非托管代码。 - sebf
1个回答

16
混合类型实际上指的是混合内存模型。非托管类型存放在堆上,托管类型存放在垃圾回收堆中,所以当你在托管类型中嵌入非托管类型时,它将需要在两个堆上分配内存,这就是使用指针进行此类操作的原因。指针是托管的,它所指向的值不是。
我自己也很好奇,于是我找到了这篇文章。 http://blogs.msdn.com/b/branbray/archive/2005/07/20/441099.aspx 这个人似乎知道他在说什么。
不过,这是一个好问题...

那篇文章中有一些很棒的信息,非常感谢!这让我想知道还有多少其他编程语言特性是为了防止程序员犯错而设计的(至少在C#中我数到了一个;switch语句中没有case穿透)。 - sebf
链接似乎已过期。 - mradul dubey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接