2012-08-10 6 views
2

가능한 중복 :
C programming : How does free know how much to free?free()에 길이 매개 변수가 필요하지 않은 이유는 무엇입니까?

임의의 생각이 어떻게 free(myPtr)의 길이 매개 변수를 필요로하지 않는다 오는 것을 나에게 발생? 얼마나 많은 메모리를 무료로 사용할 수 있는지 어떻게 알 수 있습니까?

각 시작 주소에 할당되는 메모리 양을 추적 할 수 있다고 추측 할 수 있습니다.

답변

6

이것은 malloc이 대개 할당 된 청크의 길이에 대한 정보를 프로그램에 반환 된 주소 앞에 오는 지점에 저장하기 때문입니다. 구현이 size_t에 여분의 스토리지를 할당하고, 거기에 크기를두고, sizeof (size_t)를 추가하고, malloc-ed 포인터로 사용자에게 반환하는 것은 드문 일이 아닙니다. 이 표준은이 구현을 요구하지 않으므로 다른 구현이 가능합니다. 해시 테이블을 기반으로합니다.

+1

또한 청크의 길이를 추적하는 개발자 문제를 예방하는 것은 물론 더 쉽습니다. – Annabelle

+1

또한 작은 객체를 할당하는 방법에 대해서도 읽었습니다. 각 영역에는 특정 크기의 객체 만 포함되어 있으므로 여유 메모리가있는 영역을 확인하여 크기를 알아낼 수 있습니다. – Gir

3

C가 메모리를 할당 할 때, C는 메모리에 할당 된 포인터와 관련된 길이를 기록합니다. (종종 메모리 블록 바로 앞에있는 영역에 있지만, 구현 세부 사항입니다.) 이것은 전달되는 메모리 블록의 테이블이나 목록을 유지하며, 메모리를 확보하면 C는 해당 블록의 길이를 포인터 값에.

free에 전달하는 포인터가 malloc에서 가져온 포인터와 정확히 일치해야하는 이유 중 일부입니다. 그것이 아니라면, C는 혼란스럽고 올바른 메모리 블록 (또는 그 길이)을 찾을 수 없으며, 결코 만지지 말아야 할 일부 메모리를 "해제"하게됩니다. (그렇게하면, "heap corruption"이라는 상태로 끝날지도 모릅니다. 그때부터 C는 기존 메모리의 중간에 메모리를 할당하는 등 모든 종류의 이상한 작업을 수행 할 것입니다. 블록 및 맹 글링).

관련 문제