2013-04-11 8 views
1

코드에서 개체를 삭제할 때 충돌로 고통받는 이상한 문제가 있습니다. 개체가 유효하며 메모리 누수가 없으므로 덮어 쓸 수 있으며 디버그 모드에서만 발생합니다. Linux에서 컴파일 된 동일한 코드가 디버그 및 릴리스 빌드에서 모두 잘 작동합니다. 그래서 나는 그것이 Visual Studio debug-CRT에 이상한 문제라고 생각합니다.정적/동적 라이브러리 혼합에서 Debug-CRT를 연결할 때 충돌이 발생합니까?

다음과 같이 내 소프트웨어가 구성되어

:

두 정적 라이브러리는 "멀티 (디버그) DLL을 스레드"모드로 컴파일하고 함께 연결되어 있습니다 : 모드에서 컴파일 공유 라이브러리 (DLL) "멀티 스레드 (디버그) ". 논리에서 나는 그것이 다른 방향으로 이어져야한다고 말하고 싶지만, 나는 미해결 된 상징의 엄청난 양을 얻는다.

마지막으로 위에서 언급 한 DLL을 호출하는 "다중 스레드 (디버그) DLL"모드로 컴파일 된 실행 파일이 있습니다. 여기에 "멀티 스레드 (디버그)"로 전환해도 차이가 없습니다.

개체 삭제에 충돌이 dbgheap.c에서 일어나는

/_heap_alloc_dbg_impl() -> mlock.c/_unlock() - 그래서

의 기능 : 어떤 문제가 될 수 있을까? 디버그 모드에서 CRT와 호환되지 않습니까? 아니면 다른 이유가있을 수 있습니까? 리눅스와 릴리스 빌드에서 원활하게 작동하기 때문에 일반적인 메모리 누수가 아니라고 확신합니다.

+0

공유 라이브러리 (DLL) 컴파일 설정을 "다중 스레드 디버그 DLL"(/ MDd 컴파일러 스위치)으로 변경하십시오. CRT 설정은 각 라이브러리 및 .EXE에 대해 동일해야합니다. –

답변

1

라이브러리를 정적으로 링크 할 때 과 동일한 CRT "flavors"를 사용해야합니다.

당신은 DLL을 사용하는 경우 : 그들이 순수 C 인터페이스를 노출하는 경우

  • 을 (예 : 더 STL의 경계에서 수업이없는) 당신은 메모리 할당과 할당 해제가 모두 있는지 확인은 라이브러리 코드 내부에서 수행 (또는 더 일반적으로, both client and library use the same allocator)

  • 또는 그들이 COM 있습니다 DLL의 경우

  • ,

당신은 그들을 다른 맛 브라운관의, 또는 다른 버전 벤처 캐피탈 ++ 컴파일러의에 내장 된 내장 된 실행 파일에서 사용할 수 있습니다.

그러나 DLL에 STL 클래스와 같은 C++ 클래스가 경계에있는 경우 정적 연결 라이브러리에 대한 강력한 제한이 있습니다. 즉, 동적으로 링크 된 CRT 맛보기 (디버그 또는 릴리스)를 사용해야합니다. DLL 및 EXE, EXE 및 DLL은 모두 컴파일러 및 동일한 설정 (예 : _HAS_ITERATOR_DEBUGGING)으로 작성해야합니다.