2011-01-03 2 views
7

여러 가지 이유로 C 런타임에서 Windows 힙 API를 사용하는 코드로 변환하려고하는 중이라는 코드가 있습니다. 나는 (핸들에 대한 GetProcessHeap와) HeapAlloc/HeapReAlloc/HeapFreemalloc/calloc/realloc/free 전화를 리디렉션하는 경우, 메모리 (나쁜 포인터가 반환되지 올바르게 할당 될 것으로 보인다 및 예외가 발생하지 : 나는 문제가 발생했습니다),하지만 내가 포팅하는 라이브러리는 "어떤 이유로 메모리를 할당하지 못했습니다"라고 말합니다.malloc과 HeapAlloc (이식성을 제외하고)에는 근본적인 차이점이 있습니까?

Microsoft CRT (아래의 힙 API 사용)와 다른 회사의 런타임 라이브러리 (아래 글로벌 메모리 API 사용)를 사용하여이 방법을 시도했습니다. 두 라이브러리의 malloc은 라이브러리와 잘 작동하지만 힙 API를 직접 사용하면 작동하지 않습니다.

할당 수가 너무 크지 않은지 (> = 0x7FFF8 바이트 이상) 나는지 확인했습니다.

제가 생각할 수있는 유일한 문제는 메모리 정렬입니다. 그럴까요? 아니면, 힙 API와 내가 모르는 CRT 메모리 API간에 근본적인 차이점이 있습니까?

그렇다면 무엇입니까? 그렇다면 정적 Microsoft Visual Studio (Visual Studio에 포함)가 HeapAlloc으로 전화하기 전에 malloc/calloc에서 몇 가지 추가 단계를 수행하는 이유는 무엇입니까? 나는 거기에 차이가 있다고 생각하지만 그것이 무엇이 될지 생각할 수 없다.

감사합니다.

답변

3

나는 하드 방법을 발견 ...

의 차이는 (RtlReAllocateHeap를 사용하는) 하지 자동 HeapAlloc를 호출하는 힌트로 널 포인터를 처리하지 근본적인 아니라, HeapReAlloc; 대신 실패합니다.

+1

HeapAlloc은 또한 0 크기의 포인터에 대해 메모리를 할당하지 않습니다. 여기서 malloc은 포인터입니다. 또한 HeapAlloc은 malloc을 호출 할 수 없으므로 새 처리기가 문제를 해결할 수없는 경우 순환 호출로 이어진다. – Necrolis

+0

죄송합니다. 고쳐, 고마워. – Mehrdad