내 질문은 .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 함수가 마샬링 된 배열을 해제 할 것이라고 가정하여 후자의 interop 메서드가 메모리 누수를 유발할까요? 아니면 interop 시스템이 마샬링 된 배열을 해제 할 것인지 알고 있습니까?
두 번째 옵션을 사용하면 누수가 없습니다. 마샬 러는 단순히 배열을 고정하고 고정 된 개체의 주소를 관리되지 않는 함수에 전달합니다. 관리되지 않는 함수가 반환되면 배열이 고정 해제됩니다.
고정은 blittable 유형의 배열에 대한 최적화입니다. 블리트 할 수없는 유형의 배열을 전달하면 마샬 러가 모든 메모리 수명을 처리합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다