가능한 중복 :
C programming : How does free know how much to free?free()에 길이 매개 변수가 필요하지 않은 이유는 무엇입니까?
임의의 생각이 어떻게 free(myPtr)
의 길이 매개 변수를 필요로하지 않는다 오는 것을 나에게 발생? 얼마나 많은 메모리를 무료로 사용할 수 있는지 어떻게 알 수 있습니까?
각 시작 주소에 할당되는 메모리 양을 추적 할 수 있다고 추측 할 수 있습니다.
가능한 중복 :
C programming : How does free know how much to free?free()에 길이 매개 변수가 필요하지 않은 이유는 무엇입니까?
임의의 생각이 어떻게 free(myPtr)
의 길이 매개 변수를 필요로하지 않는다 오는 것을 나에게 발생? 얼마나 많은 메모리를 무료로 사용할 수 있는지 어떻게 알 수 있습니까?
각 시작 주소에 할당되는 메모리 양을 추적 할 수 있다고 추측 할 수 있습니다.
이것은 malloc이 대개 할당 된 청크의 길이에 대한 정보를 프로그램에 반환 된 주소 앞에 오는 지점에 저장하기 때문입니다. 구현이 size_t에 여분의 스토리지를 할당하고, 거기에 크기를두고, sizeof (size_t)를 추가하고, malloc-ed 포인터로 사용자에게 반환하는 것은 드문 일이 아닙니다. 이 표준은이 구현을 요구하지 않으므로 다른 구현이 가능합니다. 해시 테이블을 기반으로합니다.
C가 메모리를 할당 할 때, C는 메모리에 할당 된 포인터와 관련된 길이를 기록합니다. (종종 메모리 블록 바로 앞에있는 영역에 있지만, 구현 세부 사항입니다.) 이것은 전달되는 메모리 블록의 테이블이나 목록을 유지하며, 메모리를 확보하면 C는 해당 블록의 길이를 포인터 값에.
free
에 전달하는 포인터가 malloc
에서 가져온 포인터와 정확히 일치해야하는 이유 중 일부입니다. 그것이 아니라면, C는 혼란스럽고 올바른 메모리 블록 (또는 그 길이)을 찾을 수 없으며, 결코 만지지 말아야 할 일부 메모리를 "해제"하게됩니다. (그렇게하면, "heap corruption"이라는 상태로 끝날지도 모릅니다. 그때부터 C는 기존 메모리의 중간에 메모리를 할당하는 등 모든 종류의 이상한 작업을 수행 할 것입니다. 블록 및 맹 글링).
또한 청크의 길이를 추적하는 개발자 문제를 예방하는 것은 물론 더 쉽습니다. – Annabelle
또한 작은 객체를 할당하는 방법에 대해서도 읽었습니다. 각 영역에는 특정 크기의 객체 만 포함되어 있으므로 여유 메모리가있는 영역을 확인하여 크기를 알아낼 수 있습니다. – Gir