我正在为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);
}