我有一个
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>
答案 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节目中有关于针脚指针的简短讨论。