我正在尝试构建一个cli / c ++ ref类。此类的目的是使用某些功能包装本机类指针。通过黑盒工厂方法向我提供本机类指针。对于我的生活,我无法弄清楚如何固定本机指针,使其不移动。这是代码中的场景(可以这么说):
public ref class ManagedFoo{
private:
NativeFooClass* myFoo;
public:
ManagedFoo(){
NativeFooFactory factory();
NativeFooClass* nativePtr = factory.CreateFoo();
//here is where i get lost
//create a pined pointer to the nativePtr
pin_ptr<NativeFooClass*> pinPtr = &nativePtr;
//tring to assign pinPtr to the mamaber var= compilation faliuer
myFoo = pinPtr;
}
}
我一直在: 错误C2440:'=':无法从'cli :: pin_ptr'转换为'NativeFooClass *'
我认为编译器对待它们是一样的吗?我需要静态演员吗?那似乎不对???
我试图固定这个指针的原因是因为当我尝试在方法中使用它,然后从C#调用此方法时,我得到一个AccessViolation运行时错误“{”试图读取或写入受保护的内存。这通常表明其他内存已损坏。“}”
答案 0 :(得分:2)
你不需要。本机对象存储在不由.NET垃圾收集器管理的内存中 - 它们不会被移动,并且固定不起作用。
简单地
ManagedFoo()
{
NativeFooFactory factory; // fixed most-vexing parse
myFoo = factory.CreateFoo();
}
应该足够了。
甚至更好
ManagedFoo()
: myFoo{NativeFooFactory().CreateFoo()}
{
}
更新:由于我们发现对象不能超过其工厂,
ManagedFoo()
: myFooFactory{new NativeFooFactory()}
, myFoo{myFooFactory->CreateFoo()}
{
}
虽然我建议使用某种智能指针来确保正确释放本机对象,但也许我的clr_scoped_ptr
。