我有这个 C++ 代码:
extern "C" __declspec(dllexport) VOID AllocateFoo(MY_DATA_STRUCTURE** foo)
{
*foo = new MY_DATA_STRUCTURE;
//do stuff to foo
}
然后在 C# 中我这样调用函数:
[DllImport("MyDll.dll")]
static extern void AllocateFoo(out IntPtr pMyDataStruct);
...
MyDataStructure GetMyDataStructure()
{
IntPtr pData;
ManagedAllocateFooDelegate(out pData);
MyDataStructure foo = (MyDataStructure)Marshal.PtrToStructure(pData, typeof(MyDataStructure));
return foo;
}
其中 MyDataStructure 是一个结构(不是类),它对应于 MY_DATA_STRUCTURE 并且成员被适当地编组。
所以问题:当 MyDataStructure 被 GC 时,我是否需要存储 pData 然后在非托管代码中再次释放它?MSDN 对 Marshal.PtrToStructure(IntPtr, Type) 说:“将数据从非托管内存块编组到新分配的指定类型的托管对象。” 在那句话中,“Marshall”是指“复制”吗?在这种情况下,我需要保留 (IntPtr pData),然后将其传递给非托管代码(在 MyDataStructure 析构函数中),以便我可以执行 C++“删除”?
我已经搜索过,但找不到足够明确的答案。