2013-06-07 3 views
1

여러 동적 연결 라이브러리의 솔루션에서 힙 손상은 기본적으로 하나의 단일 라이브러리 "MyLibrary.dll"을 사용하여 매번 발생하지만 "MyOtherLibrary.dll"에 대해서는 말할 수 없습니다. 코드의 관련 부분 :FreeLibrary 후의 힙 손상?

HINSTANCE hModule; 

hModule = LoadLibrary("MyLibrary.dll"); 

// hModule is checked and definitely valid 

if(hModule) 
{ 
    FreeLibrary(hModule); // HeapCorruption occurs now, but ONLY for "MyLibrary.dll" 
} 

정말 잘못 무슨 일이 일어나고 있는지 알아낼 수 없습니다. 그것은 나에게 VS 프로젝트 설정에서 뭔가를 변경해야하지만 난 아무런 단서도 변경하거나 무엇을 이유가없는 것 같습니다. 도서관 안의 코드 조각 일 수 있습니까?

추가 정보 : "MyLibrary.dll"프로젝트는 CMake 2.8로 작성되었으며 Visual Studio 2010 SP1 ("MyOtherLibrary.dll"프로젝트)에도 성공적으로 빌드됩니다.

아무도 도와 줄 수 있습니까?

+0

그 시점에서 힙 손상이 발생했음을 어떻게 식별합니까? – sharptooth

+0

첫 번째 포인트 - 다중 호출을 피하기 위해'FreeLibrary' 다음에'hModule = NULL'을 설정하십시오. –

+1

MyLibrary.dll에 DllMain에 "재미있는"코드가 있습니까? DllMain은 악명 높게 제한적인 곳입니다. – Dialecticus

답변

0

상당히 긴 검색 (비 MVP의 경우 엉망이었습니다) 이후에 일부 사용자가 추측하여 이미 응답 한 런타임 라이브러리와 관련이 있음이 밝혀졌습니다.

하지만 문제는 실제로 (libcmt.lib)에 연결했던 런타임 라이브러리 자체가 아니었지만 런타임 라이브러리는 프로젝트에서 무시하도록 설정되었습니다 (libcmtd.lib가 아니 었습니다).

이 페이지의 microsoft에 따르면 사용중인 라이브러리에 따라 무시할 라이브러리를주의 깊게 관찰해야합니다. 이제 링커 경고가 발생하지 않는 이유가 궁금합니다. 그러나 그것은 다른 주제입니다.

어쨌든 귀하의 도움에 많은 감사드립니다!

3
// HeapCorruption occurs now, but ONLY for "MyLibrary.dll" 

댓글이 잘못되었습니다. 이 코드는 그 잠시 동안 사용되었습니다 해제 일부 메모리를 가질 가능성이 후 종료 될 때, 매우 일반적인 시나리오입니다

// HeapCorruption is detected now. 

을 말해야한다. 포인터 버그와 버퍼 오버 플로우로 인해 메모리가 손상 될 수있는 충분한 기회를 제공합니다. 또는 EXE와 DLL이 서로 다른 CRT 버전을 사용할 때 디버그 힙에서 진단을받습니다. 그런 종류의 힙 손상은 힙 관리자가 메모리를 방문하여 릴리스해야만 알 수 있습니다. 그 때 Kaboom.

<crtdbg.h>에서 사용할 수있는 디버그 할당자를 사용하면 이전에 그런 종류의 손상을 잡을 수 있습니다. 많은 디버깅 도구가 일반적으로 힙 손상 버그를 해결하는 데 사용할 수 있습니다.

+0

Application Verifier라는 도구가 있는데 문제가되는 곳에서 프로그램을 중단시킬만큼 운이 좋을 수도 있습니다. –

+0

@ 한자 Passant :> 댓글이 잘못되었습니다 - 잘 재생됩니다. crtdbg에 대한 힌트를 주셔서 감사합니다. – fiscblog