관리 메뉴

KorSA

C# 과 C++ 간 마샬링시 Heap Corruption 오류에 관하여 본문

Development Experience/C, C++

C# 과 C++ 간 마샬링시 Heap Corruption 오류에 관하여

Praiv. 2019. 9. 18. 21:04
320x100

 * 현상 :  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 라이브러리 영역을 따로 가지므로, 각자가 할당한 메모리는 각자가 해제해주도록 하자.

 

728x90
728x90
Comments