Development Experience/C, C++ (14) 썸네일형 리스트형 HeapAlloc, LocalAlloc, GlobalAlloc 차이 참고> https://skensita.tistory.com/entry/HeapAlloc-LocalAlloc-GlobalAlloc-%EA%B0%81%EA%B0%81-%EC%96%B4%EB%96%BB%EA%B2%8C-%EB%8B%A4%EB%A5%B8%EA%B0%80 1. Win16 운영체제에서는 프로그램마다 가지는 Local Heap과 Heap Manager가 가지는 Global Heap이 따로 존재했지만 Win32 운영체제에서는 따로 존재하지 않음. 즉, Win32 운영체제에서는 Local Heap과 Global Heap이 동일하고 이말인 즉슨 LocalAlloc과 GlobalAlloc이 동일함을 의미 2. LocalAlloc은 어플리케이션의 Default Heap에 메모리를 할당함. Default Hea.. C++ Heap corruption 원인 C++ 로 코딩을 하다보면 간헐적으로 Heap Corruption이 발생하는데, 그때마다 매번 같은 실수를 반복한 게 원인이었다. 바로 메모리를 두 번 해제하는 것. MyClass myVar = new MyClass(); for(int i = 0; i < 2; i++) { delete myVar; } 이렇게 하면 두번째 루프에서 이미 메모리 해제된 myVar을 또다시 메모리 해제한다. 이 때 Heap Corruption이 발생한다. if(myVar != nullptr) { delete myVar; myVar = nullptr; } 요렇게 메모리를 해제하고 나서 변수의 값을 NULL로 초기화해주자. 그리고 메모리를 해제하려 할 때 변수의 값이 NULL인지 확인을 먼저 해주자. DLL이 경로에 있음에도 DLLNotFound Exception이 뜬다면.. C# 프로그램에서 C++로 작성된 DLL 파일을 로드하려했는데(DllImport) DllNotFoundException 오류가 발생하였다. 찾아보니 C#에서 C++ DLL을 로드하기 위해선 1. C#의 빌드 형식과 C++ DLL의 빌드 형식이 맞아야 한다. 즉, x86이면 x86끼리, x64면 x64끼리 로드해야 한다는 얘기. 2. 같은 경로에 있어야 한다. 3. 함수 호출 스택 (cdecl 인지, stdcall 인지) 이 맞아야 한다. 즉, C++ DLL의 호출 스택이 cdecl이면 C# 에서도 cdecl로, stdcall 이면 stdcall로 받아주어야 한다. 4. C++ DLL에서 extern "C"를 선언해야 한다. 위와 같은 조건이 맞아야 한다. 위의 4가지를 다 해봤는데도 안되었다... 그러다.. C++ <-> C# 간 마샬링 시 메모리 할당 및 해제 Win32 API 중 메모리 할당 및 해제를 할 때 LocalAlloc(), LocalFree() 함수를 사용한다. C++ C# 간 마샬링을 할 때 한 쪽에서 LocalAlloc()을 통해 메모리를 할당하고, 다른 한 쪽에서 LocalFree()를 통해 메모리 해제가 가능하다. C#에선 마샬링할 때 Marshal.AllocHGlobal() 을 많이 사용하는데, 이 함수 내부는 Win32 함수인 LocalAlloc()을 호출하는 식으로 구성되어 있다. LocalAlloc(), LocalFree() 와 같은 역할을 하는 Win32 함수로 CoTaskMemAlloc(), CoTaskMemFree() 가 있다. LocalAlloc(), LocalFree() 가 C#의 Marshal.AllocHGlobal(), .. Error Message: 식에 정수 또는 범위가 지정되지 않은 열거형 형식이 있어야 합니다 식 (1983 * 214013 + 2531011) % (2^32) 에서 %(모듈러) 연산을 수행하려 하는 중 이 에러가 발생하였다. 모듈러 연산은 정수형에 대해서만 수행 가능한데, 나는 double 형으로 수행하려고 하였기 때문이다. C++ 에서 2^32 를 구하기위해 pow(2, 32)를 사용하였고, 이 리턴값이 double 형인 것이다. 일반적으로 이 에러가 발생하였다면 간단히 double형 변수가 있는 자리에 int형 변수를 넣으면 된다. 나도 단순히 double 형을 int 형으로 캐스팅하려 했는데.. 생각해보니 2^32 라는 int형 범위를 넘어버리는 것이다. 심지어 unsigned int 형 범위도 2^32 - 1 까지다. 살짝 멘붕이 왔다. % 를 쓰기 위해선 정수형으로 연산해야 하는데, 연.. C# 과 C++ 간 마샬링시 Heap Corruption 오류에 관하여 * 현상 : 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 라이브러리에서 이 메모리를.. 이전 1 2 다음