- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有这个 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/
我的计算机中有一 block 硬件...共享内存。我用返回指向此共享内存的指针的 .dll 调用它。一旦返回指针,旧的 C++ 程序就会写入和读取映射到该指针的结构。 现在我想制作一个新的 C# 程序
有人可以向我解释以下参数异常:结构不能是值类吗?这是由我程序中的以下代码行引起的: Marshal.PtrToStructure(m.LParam, dbh); 假设 dbh 是以下类型: [Stru
谁能看出它失败的原因?如果我用“ref BITMAP lpvObject”替换“out IntPtr lpvObject”,我可以让它以这种方式工作。但我看不出代码有什么问题。 using Syste
在 C++ 中,我有这个: struct BasePacketProto { unsigned short PACKET_OPCODE; unsigned short PACKET_M
我有这个结构: [StructLayout(LayoutKind.Sequential)] public struct IS { public UInt32 ID;
在我的程序 (C#) 中,我使用方法 Marshal.PtrToStructure 将对象转换为在循环中将内存地址添加到结构。在第一个元素,这个工作正常。但是在第二个元素处,发生了访问冲突异常。 ac
我有一个系统,其中远程代理发送序列化结构(来自嵌入式 C 系统)供我通过 IP/UDP 读取和存储。在某些情况下,我需要发回相同的结构类型。我认为我使用 Marshal.PtrToStructure(
在 64 位中运行时,我的单元测试在这段代码上崩溃。 崩溃发生在循环第二次迭代的 Marshal.PtrToStructure 调用上。 “entriesRead”显示为 4,因此它应该能够正确读取,
我正试图对我公司的一堆遗留二进制数据进行逆向工程,以便我可以将其转换为更持久的格式。我们用于创建此数据的应用程序不再受支持。 我发现我可以在一系列结构中描述数据,并且我已经能够使用 Marshal.P
JNA 中 .NET 的 Marshal.PtrToStructure 有什么等价物? 我正在尝试用 Java 编写一个 Firefox 密码解密器,并且正在查看 C# 的等效项,我已经完成了其中的大
我正在尝试将 byte[] 转换为包含数组的结构,该结构包含数组。 像这样: [StructLayout(LayoutKind.Sequential, Pack = 4)] public struct
我通过调用 Marshal.PtrToStructure(intPtr, typeof(Servent)) 得到一个 AccessViolationExcpetion。任何想法我做错了什么?我在 x6
我正在使用 unity3d 开发一个游戏项目。 现在我正在尝试统一将结构从 C++ 传递到 C#。 C++ 中的结构如下所示: #pragma pack(push) #pragma pack(1) c
我正在尝试从键盘 Hook 的 lParam 获取 KBDLLHOOKSTRUCT。 private static IntPtr HookCallback(int nCode, IntPtr
我有这个 C++ 代码: extern "C" __declspec(dllexport) VOID AllocateFoo(MY_DATA_STRUCTURE** foo) { *foo =
我在使用 Marshal.PtrToStructure() 从指向 DEVMODE 类型结构的指针中提取数据时遇到问题。 Here是指向 DEVMODE 结构上的 MSDN 条目的链接。 我对该结构的
我有一个使用 PInvoke 在 C# 和 C++ 之间编码数据的应用程序。该应用程序是一个本地 C++ 应用程序,它在内部使用 C# 部分启动 CLR。 有时我必须将数据从 C++ 编码到 C#
我正在尝试使用现有代码将包含 std::bitsets 的 C++ 结构映射到它的 C# 版本。 我的代码在这些简单的对象上工作得很好: // C++ struct struct log_t {
我们在尝试 PInvoke read() 时遇到奇怪的行为linux/libc 与 Mono 的方法。 [16:05:17.258][UNHANDLED EXCEPTION][BEGIN][16:05
我是一名优秀的程序员,十分优秀!