gpt4 book ai didi

c# - 我是否需要删除非托管代码中通过 Marshal.PtrToStructure 编码(marshal)的结构?

转载 作者:可可西里 更新时间:2023-11-01 08:21:14 27 4
gpt4 key购买 nike

我有这个 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++“删除”?

我已经搜索过,但找不到足够明确的答案。

最佳答案

正如 Erik 所说,Marshal 确实意味着复制,但我认为他没有回答您问题的要点。

在 MyDataStructure 被 GC 之前,您是否需要保留 pData native 指针?没有。

编码后,您的 MyDataStructure 实例 foo 包含 pData 指向的结构的副本。您无需再保留 pData。为避免内存泄漏,您必须将该 pData 传递给另一个将删除它的非托管函数,这可以在编码(marshal)处理后立即完成,无论您持有 MyDataStructure 实例多长时间。

关于c# - 我是否需要删除非托管代码中通过 Marshal.PtrToStructure 编码(marshal)的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/497133/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com