指向本机对象

时间:2016-07-07 13:00:32

标签: pointers c++-cli

我有一个托管类,其成员是指向本机对象的指针。像这样(不是真正的代码):

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

应用程序崩溃说我尝试读取或写入受保护的内存"。我该怎么办?

1 个答案:

答案 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