C# 关于数组的Dll互操作和内存管理
我的问题是关于在.Net中互操作DLL时的内存使用情况(我使用的是C#,但答案应该适用于其他.Net语言) 假设我在dll中有一个C函数,它接受一个数组:C# 关于数组的Dll互操作和内存管理,c#,.net,interop,marshalling,C#,.net,Interop,Marshalling,我的问题是关于在.Net中互操作DLL时的内存使用情况(我使用的是C#,但答案应该适用于其他.Net语言) 假设我在dll中有一个C函数,它接受一个数组: extern __declspec(dllexport) void Func(int * arr, int len); 我可以在C#中选择两个相应的调用: 或: 如果C函数未解除分配阵列,则后一种互操作方法是否会通过假定C函数将释放封送阵列而导致内存泄漏,或者互操作系统是否知道要释放封送阵列?使用第二个选项时不会发生泄漏。封送拆收器只是固定
extern __declspec(dllexport) void Func(int * arr, int len);
我可以在C#中选择两个相应的调用:
或:
如果C函数未解除分配阵列,则后一种互操作方法是否会通过假定C函数将释放封送阵列而导致内存泄漏,或者互操作系统是否知道要释放封送阵列?使用第二个选项时不会发生泄漏。封送拆收器只是固定数组,并将固定对象的地址传递给非托管函数。当非托管函数返回时,数组被取消固定 钉扎是针对可空袭类型阵列的优化。如果您传递一个不可blittable类型的数组,封送拆收器将负责所有内存生存期
[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);