2016-08-21 1 views
0

Microsoft Visual Studio 2015 (v14.0) 3 가지 프로젝트가 포함 된 솔루션이 있습니다.런타임 라이브러리 옵션이 런타임에 변경되는 효과

그 중 두 프로젝트는 DLL이고 다른 DLL은 실행 파일입니다.
실행 파일은 런타임에 DLL을로드하고 함수를 호출하며 매개 변수를 교환합니다. Window의 LoadLibraryGetProcAddress API를 사용합니다.

모드에서 모드에서 내 프로젝트의 Runtime LibraryMulti-threaded DLL으로 설정하면 모든 것이 정상적으로 작동합니다. Debug 모드의 경우 Multi-threaded Debug DLL입니다.

내가 Debug에 대한 Release 또는 Multi-threaded Debug에 대한 Multi-threaded로 변경하면 내가 디버그 어설 션 오류 또는 메모리 액세스 위반 오류 및 오류의 다른 종류를 받기 시작. (변경하면 솔루션의 모든 프로젝트에서 변경됩니다.)

Multi-threaded 옵션을 사용해야 만 대상 컴퓨터에서 C++ 런타임 라이브러리가 필요하지 않습니다. 이 문제를 어떻게 해결할 수 있습니까?

답변

0

/MT을 사용하면 엔티티 (즉, DLL과 실행 파일)의 런타임이 분리되어 각각이 자체 런타임을 가지므로 자신의 힙이 하나의 메모리를 할당하려고 시도하고 다른 하나를 해제하면 오류가 발생하게됩니다. 다른 모듈은 할당 된 메모리를 알지 못하기 때문에.
한편, /MD을 사용하면 모든 모듈이 동일한 런타임을 공유하며 런타임에서 하나의 메모리에 할당 된 메모리를 인식하기 때문에 다른 모듈에서 메모리를 확보 할 수 있습니다. 런타임의 한 인스턴스가 전체 메모리를 관리하기 때문입니다.

편집 : 감사 에 DXIV 코멘트.

+0

작성한 내용에 약간의 오해가 있습니다. 주소 공간은 프로세스 단위이며 DLL *은 항상 동일한 주소 공간을로드 한 프로세스와 동일한 프로세스에서로드 된 다른 DLL과 공유합니다. 동일한 프로세스 내 다른 곳에서 하나의 DLL 함수에 할당 된 메모리에 액세스하는 것은 완벽하게 안전합니다. '/ MT'는 하나의 DLL에서 코드에 메모리 ('new')를 할당 한 다음 다른 DLL의 코드에서 해제 ('delete')합니다. 왜냐하면'/ MT'는 각 DLL이 자체적으로 가지고 있기 때문입니다 CRT 사본은 정적으로 링크되어 있습니다. 예를 들어 [이 답변] (http://stackoverflow.com/a/8157934)을 참조하십시오. – dxiv

+1

@dxiv 당신 말이 맞아요, 코멘트 주셔서 감사합니다. 나는 대답을 수정했다. –

관련 문제