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
'Development Experience > C, C++' 카테고리의 다른 글
HeapAlloc, LocalAlloc, GlobalAlloc 차이 (0) | 2020.11.25 |
---|---|
C++ Heap corruption 원인 (0) | 2020.04.08 |
DLL이 경로에 있음에도 DLLNotFound Exception이 뜬다면.. (0) | 2019.11.12 |
Error Message: 식에 정수 또는 범위가 지정되지 않은 열거형 형식이 있어야 합니다 (2) | 2019.10.03 |
C# 과 C++ 간 마샬링시 Heap Corruption 오류에 관하여 (0) | 2019.09.18 |