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

Dll interop and memory management concerning arrays

我的问题是关于在 .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 函数将释放编组数组或互操作系统知道释放编组数组而导致内存泄漏?

使用第二个选项时没有泄漏。封送拆收器只是固定数组,并将固定对象的地址传递给非托管函数。当非托管函数 returns 时,数组被取消固定。

固定是对 blittable 类型数组的优化。如果您传递了一组非 blittable 类型,那么封送拆收器将处理所有内存生命周期。