有关数组的Dll互操作和内存管理

本文关键字:内存 管理 互操作 Dll 数组 | 更新日期: 2023-09-27 18:01:40

我的问题是关于。net中插入dll时的内存使用(我使用c#,但答案应该适用于其他。net语言)。

假设我在dll中有一个C函数,它接受一个数组:

extern __declspec(dllexport) void Func(int * arr, int len);

我可以在c#中选择两个对应的调用:

[DllImport("Lib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void Func([In] IntPtr arr, [In] int len);

或:

[DllImport("Lib.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern void Func([In] int[] arr, [In] int len);

如果C函数没有释放数组,后一种互操作方法是否会因为假设C函数将释放编组数组而导致内存泄漏,或者互操作系统是否知道要释放编组数组?

有关数组的Dll互操作和内存管理

使用第二个选项时没有泄漏。封送处理程序只是固定数组,并将固定对象的地址传递给非托管函数。当非托管函数返回时,数组被解除固定。

钉住是对位元类型数组的优化。如果传递的是一个非位元类型数组,那么编组程序将负责整个内存生命周期。