Unity C ++插件持久性std :: shared_ptr

时间:2018-02-15 06:34:17

标签: c++ c++11 unity3d

我正在为Unity编写一个原生插件,但却坚持使用智能指针的生命周期功能。

C#

[DllImport("Serializer")]
private extern static IntPtr Internal_CreateInstance();

代码中的某处:

IntPtr l_nativePtr = Internal_CreateInstance(); //l_nativePtr stay alive forever until i call delete, which is good/acceptable for me.

C ++ (使用原始指针的方式):

DLL_EXPORT SomeClass* Internal_CreateInstance()
{
   SomeClass* l_obj = new SomeClass();
   return l_obj;
}

以上情况一直有效,直到我需要使用智能指针来避免悬空指针问题。实际上,我需要在我的其他课程SomeClass中保留MyArray的引用(std::listof<SomeClass*>存储在delete(SomeClass)中。如果我调用MyArray实例,则代码在某处,然后std::list<std::weak_ptr<SomeClass>>保持一个已经释放的指针,然后悬挂指针盒。

然后我决定实现智能指针概念并在MyArray中保持weak_ptr(现在extern "C" { DLL_EXPORT SomeClass* CreateInstance() { std::shared_ptr<SomeClass> l_obj = std::make_shared<SomeClass>(); //LINE#1 } )。但面对以下问题。

shared_ptr<SomeClass>.get()

问题#1 (LINE#1):不能在这里使用shared_ptr,因为“C”编译器不知道std:shared_ptr。 解决方案:在静态函数中的'SomeClass'中创建shared_ptr实例,并为SomeClass*实例返回std::shared_ptr<SomeClass>。以及在SomeClass内部保留std::weak_ptr的实例以防止自动销毁。这好吗?

问题#2:如果上面的解决方案可以接受,我仍然无法在我的代码中随处实现。有没有其他方法可以保持'std :: shared_ptr&lt;&gt;'执着?我需要使用std::weak_ptr<>来避免悬空指针案例和std::shared_ptr<>需要[DllImport("Serializer")] private extern static void Internal_SomeClass_PerformSomething(IntPtr a_nativePtr, bool a_boolValue); 才能使用。

仅供参考,我正在创建原生指针,返回&amp;保持C#中的引用作为IntPtr,每当我想执行任何操作时,我发送 native_pointer + data ,例如,

C#

DLL_EXPORT void Internal_SomeClass_PerformSomething(SomeClass* a_nativePtr, bool a_boolValue)
{
...
... //Do things here
}

C ++

    void Update () {
        transform.Translate(new Vector3(0,0,1) * Time.deltaTime * 2,Space.Self);
    }

0 个答案:

没有答案