* 현상 : Marshaling 할 때 C#에서 out 파라미터로 보낸 string 변수를, C++ 에서 이 변수에 메모리 할당 후 C#으로 리턴을 시도하였다. 하지만 C++ 함수가 리턴되자마자 C#에서는 Heap Corruption 에러가 발생하였다.
원인을 찾아보니 C++에서 관리하는 메모리는 C++에서 할당 및 해제를, C#에서 관리하는 메모리는 C#에서 할당 및 해제를 해야 하는 것 같았다. exe 파일(C#으로 작성)과 dll 파일(C++로 작성)에서 관리하는 힙 영역은 각각의 CRT 라이브러리를 사용하고 각자의 Heap Manager를 소유하고 있다. 그래서 한 CRT 라이브러리 내에서 할당한 메모리를 포인터를 통해 DLL boundary 너머로 보내고, 다른 CRT 라이브러리에서 이 메모리를 해제하려 한다면 Heap Corruption 에러가 뜨는 것이다.
* 해결 방법 : 각각의 CRT 라이브러리 영역이 아닌 Global Heap 영역에 메모릴 할당을 함으로써 C++에서 할당한 메모리를 C#에서 접근하여 해제할 수 있도록 하였다.
* 결론 : EXE, DLL 들은 각자 Heap Manager와 CRT 라이브러리 영역을 따로 가지므로, 각자가 할당한 메모리는 각자가 해제해주도록 하자.
반응형
'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 |
C++ <-> C# 간 마샬링 시 메모리 할당 및 해제 (0) | 2019.10.14 |
Error Message: 식에 정수 또는 범위가 지정되지 않은 열거형 형식이 있어야 합니다 (2) | 2019.10.03 |