混合管理/非托管C ++ / CLI项目中的&符运算符

时间:2015-12-01 16:33:22

标签: .net c++-cli smart-pointers mixed-mode

在C ++ / CLI ref类中编写函数时,我希望在调用本机函数时传递一个指向对象的指针。

原生功能

void MyNativeFunc(NativeObject** obj);

托管C ++ / CLI功能

ref class ManagedType
{
    static NativeObject* m_NativeObj;
    void MyManagedFunc()
    {
        MyNativeFunc(&m_NativeObj);  // Error here
    }
}

这里的问题是C ++ / CLI中的&m_NativeObj不是NativeObject**。它是本地函数无法接受的interior_ptr<NativeObject*>。是否有一种语法,以便我可以执行这个简单的引用操作而不会产生托管指针?

修改 道歉。最初,m_NativeObj是问题中的函数成员,而不是类的静态成员。我只有在它是静态成员时才会遇到问题。

1 个答案:

答案 0 :(得分:1)

我假设你的原生函数采用NativeObject**的原因是因为函数会为它分配一个新对象,在这种情况下你可以这样做:

class NativeObject { };

void MyNativeFunc(NativeObject** obj) {
    *obj = new NativeObject;
}

ref class ManagedObject
{
public:
    void Test()
    {
        NativeObject* p = nullptr;
        MyNativeFunc(&p);
        delete m_NativeObj;
        m_NativeObj = p;
    }

    static NativeObject* m_NativeObj = nullptr;
};

另一方面,如果本机函数是可能为指针指定新值的输入/输出函数,则可以编写如下代码:

class NativeObject { };

void MyNativeFunc(NativeObject** obj) {
    if (!(*obj))
        *obj = new NativeObject;
}

ref class ManagedObject
{
public:
    void Test()
    {
        pin_ptr<NativeObject> pinned = m_NativeObj;
        NativeObject* p = pinned;
        MyNativeFunc(&p);
        if (p != m_NativeObj)
        {
            delete m_NativeObj;
            m_NativeObj = p;
        }
    }

    static NativeObject* m_NativeObj = nullptr;
};