DLL에서 static CRT를 사용하면 각각의 DLL은 다른 heap을 사용하는가?

‘DLL프로젝트에서 static CRT를 사용할 경우 각각의 static CRT는 각각의 heap을 사용한다.
따라서 static CRT를 사용하는 DLL을 2개 사용할 경우 프로세스에는
exe(1) + dll(1) + dll(1) = 3 해서 최소한 3개의 heap이 존재한다.’

라고 기억하고 있다.

근데 최근에 발표자료 만들면서 테스트 해보니 DLL을 여러 개 로드해도 heap 개수가 증가되지 않는 것으로 확인되었다.

Windows 10이전에는 CRT가 msvcrtxxx.dll에 구현되어 있었고 Windows 10부터는 msvcrtxxx.dll도 가지고는 있지만 기본 CRT가 ucrtxxxx.dll로 변경되었으므로 아마 그 차이가 아닐까 싶다.

해서 아예 예전에 설치해둔 VS2003으로 테스트 해봄.

[결과]
VS2003에서 빌드한 .EXE에서 .DLL을 로드해보면 LoadLibrary() 직후 heap이 하나 증가함.
추가로 DLL한 개를 더 로드 해보니 heap이 또 추가 됨. LoadLibrary()할 때마다 heap 개수가 증가함.
콜스택 따라가보면 msvcrt library의 할당 코드를 실행한다.
당연하게도 VS2022에서 빌드한 코드는 ucrt library의 할당 코드를 실행한다.

LoadLibaray() 호출 전

LoadLibrary() 호출 1회

LoadLibrary() 호출 2회

[결론]
msvcrt기반의 static CRT코드는 DLL마다 별도의 heap을 생성한다. 따라서 malloc을 호출하면 개별적인 heap에서 할당한다.

ucrt기반의 CRT코드는 DLL마다 별도의 heap을 생성하지 않는다. 따라서 malloc을 호출하면 기본 프로세스 heap을 사용한다.


DLL에서 static CRT를 사용하면 각각의 DLL은 다른 heap을 사용하는가?”에 대한 답글 1개

댓글 남기기