관리 메뉴

KorSA

C++ <-> C# 간 마샬링 시 메모리 할당 및 해제 본문

Development Experience/C, C++

C++ <-> C# 간 마샬링 시 메모리 할당 및 해제

Praiv. 2019. 10. 14. 15:20
320x100

Win32 API 중 메모리 할당 및 해제를 할 때 LocalAlloc(), LocalFree() 함수를 사용한다.

 

C++ <-> C# 간 마샬링을 할 때 한 쪽에서 LocalAlloc()을 통해 메모리를 할당하고, 다른 한 쪽에서 LocalFree()를 통해 메모리 해제가 가능하다.

 

C#에선 마샬링할 때 Marshal.AllocHGlobal() 을 많이 사용하는데, 이 함수 내부는 Win32 함수인 LocalAlloc()을 호출하는 식으로 구성되어 있다.

 

LocalAlloc(), LocalFree() 와 같은 역할을 하는 Win32 함수로 CoTaskMemAlloc(), CoTaskMemFree() 가 있다.

LocalAlloc(), LocalFree() 가 C#의 Marshal.AllocHGlobal(), Marshal.FreeHGlobal()에 대응한다면,

CoTaskMemAlloc(), CoTaskMemFree()는 C#의 Marshal.AllocCoTaskMem(), Marshal.FreeCoTaskMem()에 대응한다.

 

이렇게 managed 언어와 unmanaged 언어를 섞어 쓰면서 한쪽에서 할당한 메모리를 다른 한 쪽에서 해제하는게 가능하지만, 일반적으로 이런 방식은 바람직하지 못하다. 왜냐하면 메모리의 할당과 해제를 담당하는 주체가 모호해지기 때문이다. 따라서, 되도록이면 한 쪽에서 할당한 메모리는 그 영역 내에서 해제하는게 바람직하다.

 

참고> https://stackoverflow.com/questions/33481888/pinvoke-allocate-memory-in-c-and-free-it-in-c-sharp

728x90
728x90
Comments