2015-07-09 2 views
0

Мой вопрос об использовании памяти при взаимодействии DLL в .Net (я использую C#, но ответ должен применяться к другим .Net-языкам).Dll interop и управление памятью относительно массивов

Скажем, у меня есть функция C в DLL, который принимает массив:

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 будет освобождать маршаллированный массив или система interop знает, чтобы освободить маршаллированный массив?

ответ

2

Нет утечки при использовании второго варианта. Маршалер просто выталкивает массив и передает адрес закрепленного объекта неуправляемой функции. Когда неуправляемая функция возвращает массив, он остается незакрепленным.

Пиннинг - это оптимизация для массивов типа «мягкого» типа. Если бы вы передавали массив не-blittable типов, тогда маршалер позаботился бы о жизни всей памяти.

Смежные вопросы