2017-11-29 8 views
-1

DLL에서 할당 된 메모리를 삭제하려고합니다. /MDd의 DLL 메모리를/MD Exe 파일에서 삭제하면 힙이 손상됩니다.

내가 테스트

..
  1. EXE 파일 :/MD, DLL :/MDD => HeapCorruption.
  2. Exe :/MD, DLL :/MD => 내가 볼 때 작업이 잘됩니다. 심지어되는 LocalAlloc이 같은 결과를 만들어

...

만큼 내가 아는 한, 다중 스레드 DLL CRT는 같은 힙 메모리를 사용하고 있습니다. 케이스 1 테스트가 항상 힙이 손상된 이유를 말해 줄 수 있습니까?

및 어떻게 해결할 수 있습니까?

- 추가.
ofcourse 같은 장소에서 할당/탈퇴를 제한하는 것이 가장 좋습니다.

그러나 내 prob는 .. 크기는 먼저 exe 파일에서 볼 수 있지만 dll은 출력 매개 변수로 메모리를 사용해야합니다. - 크기/버퍼를 가져 오는 것이 내가 원하지 않는 것입니다 (dll 사용자에게 너무 복잡합니다).

+0

디버깅과 릴리스를 혼합하고 있습니까? '/ MDd'는 디버그에 사용됩니다. '/ MD'를 릴리스합니다. 디버그 및 릴리스를 혼합하면 디버그 힙이 릴리스 힙과 호환되지 않으므로 힙을 손상시킬 수 있습니다. – drescherjm

+0

디버그 CRT는 다른 할당자를 사용하므로 더 나은 진단을 제공합니다. 2012 년 이전 버전에서는 자체 힙을 만들었습니다. 확실히, 이것은 모두 잘 작동하지 않아야합니다. 당신은 이러한 문제를 강력하게 피할 수있는 장점을 가지고 있습니다. 두 프로젝트가 모두있는 VS에서 솔루션을 만들 수 있습니다. 이 프로젝트를 사용하면 설정을 동기화하고 손쉽게 수행 할 수 있으므로 이러한 프로젝트를 손쉽게 빌드하고 테스트 할 수 있습니다. 그것을 이용하지 않는 것은 큰 실수입니다. –

답변

0

dell에서 exe의 할당 된 메모리를 삭제하고 싶습니다.

그건 좋은 생각이 아닙니다. EXE 또는 DLL에서 코드 메모리 할당 및 해당 할당 해제를 그대로 두는 것이 좋습니다.

EXE와 DLL이 모두 동일한 빌드 유형 (디버그/릴리스) 인 경우에도 다른 곳에서 할당 될 때 메모리를 할당 해제하면 안됩니다.

메모리를 동일한 단위 (예 : EXE 또는 DLL)에 할당하고 할당을 해제하는 경우 메모리 손상 문제없이 실행하여 디버그 버전과 비 디버그 버전을 혼합 할 수 있어야합니다.

+0

또는 모듈 간 사용을 위해 특별히 지정된 CoTaskMemAlloc/CoTaskMemFree와 같은 할당 쌍을 사용하십시오. – SoronelHaetir