我有一个托管类,其成员是指向本机对象的指针。像这样(不是真正的代码):
ref class ManagedClass {
private:
NativeClass* ptr = nullptr;
};
我需要通过调用本地方法来初始化此指针以指向有效对象,该方法接受指向指针:
void native_init(NativeClass** nc);
但是当我尝试通过以下方式获取ptr指针到指针时:
native_init(&ptr);
VS显示消息
类型interion_ptr的参数与。不兼容 NativeClass **
类型的参数
那么,我怎样才能获得指向该指针的指针?
此代码有效:
NativeClass *local_ptr;
native_init(&local_ptr);
ptr = local_ptr;
但是当我尝试将其删除时:
delete ptr
应用程序崩溃说我尝试读取或写入受保护的内存"。我该怎么办?
答案 0 :(得分:2)
好吧,托管对象可以在内存中移动,这就是为什么编译器不允许你接收地址的原因 - 地址 迟早会过时
在固定之后,您可以将地址带到托管引用类型对象。最简单的方法是使用pin_ptr
,在pin_ptr
超出范围之前,对象将保证不会在内存中移动。
所以你可以这样写:
auto managedObject = gcnew ManagedClass();
pin_ptr<NativeClass*> pinnedNativePtr = &managedObject->ptr;
native_init(pinnedNativePtr);
但请确保{/ 1}}不会被保留,并在致电NativeClass**
之后访问。
至于你的尝试,它肯定是有效的。但是您最有可能获得native_init
因为AccessViolationException
没有使用native_init
运算符来创建对象,或者使用了不同的运行时。如果您尝试使用某个库,则应该提供某种new
函数,因此请使用该函数代替native_free
。