在cli类中声明本机类型?

时间:2009-05-21 14:49:10

标签: c++-cli

我有一个

public ref class Test
在这堂课里面,我有:

int frameWidth;
int frameHeight;
int frameStride;

当我尝试编译时,我收到错误:

error C2664: 'GetImageSize' : cannot convert parameter 1 from 'cli::interior_ptr<Type>' to 'int *'

GetImageSize是一个本机函数,只有当我将上面的3个int的声明移到类外部或调用GetImageSize的块内时,它才有效。

我该如何解决这个问题?

这3个整数需要可以通过课堂上的多个函数访问,现在我已经使它工作了,因为我将它们移到了课外,但是我认为这不是正确的事情,因为它们变得全球化了。 / p>

1 个答案:

答案 0 :(得分:3)

根据this post,你看到这个的原因是因为int是一个ref类,它可以被垃圾收集器随意移动到堆中,int的地址可能会改变,你不会不要被告知。

要解决此问题,您需要告诉GC在您使用它们时不要移动它们。为此,您需要使用

pin_ptr<int*> pinnedFrameWidth = &frameWidth;

然后将pinnedFrameWidth传递给GetImageSize。传递给方法时,pin_ptr将自动转换为int *。

使用pin_ptr时需要小心。由于GC在集合期间无法移动Test类的实例,因此托管堆可能会碎片化,最终性能会受到影响。理想情况下,尽可能少地将对象固定在极少的时间内。

this .Net Rocks节目中有关于针脚指针的简短讨论。