存在内存泄漏风险的可能性——在c#中从字节数组中获取IntPtr

本文关键字:字节 字节数 IntPtr 获取 数组 泄漏 内存 可能性 存在 | 更新日期: 2023-09-27 18:03:47

我必须使用外部DLL将数据发送到设备。我在DLL中使用的方法采用指向字节数组的指针作为参数。当我使用c#时,我正在使用GCHandle。Alloc方法获取内存地址并将其分配给IntPtr实例。然后我传递IntPtr作为参数。我担心的是代码中可能存在内存泄漏风险,因为我以前没有在c#中使用过指针和内存分配。当前的代码如下所示:

GCHandle pinned = GCHandle.Alloc(byteArray, GCHAndleType.Pinned);
IntPtr arrayPtr = pinned.AddrOfPinnedObject();
var result = _externalDll.SendInfo(arrayPtr, byteArray.Length);   
pinned.Free();

这是正确的方式来分配和使用IntPtr?它似乎可以工作,但由于这将在生产机器上每天并发运行大约100次,所以我宁愿避免任何重大问题。

存在内存泄漏风险的可能性——在c#中从字节数组中获取IntPtr

一般来说,您需要使用GCHandle的唯一时间是当非托管代码将保留对指针的引用以供以后使用时。

在这里,您似乎只是传递指针,然后立即释放它。如果是这种情况,那么你根本不应该使用GCHandle。只需将第一个参数设置为byte[],并直接传递byteArray。运行时将负责在调用期间固定数组对象,并将指向数组第一个元素的指针传递给非托管代码。