[c] 무료는 얼마나 많은 것을 무료로 알 수 있습니까?

C 프로그래밍에서, 당신은 free에 대한 인수로 당신이 좋아하는 어떤 종류의 포인터라도 전달할 수 있습니다. 그것은 할당 된 메모리의 크기를 어떻게 알 수 있습니까? 일부 함수에 포인터를 전달할 때마다 크기도 전달해야합니다 (즉, 10 요소의 배열은 배열의 크기를 알기 위해 매개 변수로 10을 받아야합니다). 그러나 크기를 전달할 필요는 없습니다. 무료 기능. 왜 그렇지 않고 배열 길이의 여분의 변수를 카트로 묶을 필요가 없도록 자신의 함수 에서이 동일한 기술을 사용할 수 있습니까?



답변

를 호출 할 때 malloc()할당 할 메모리 양을 지정합니다. 실제로 사용되는 메모리의 양은 이보다 약간 많으며 블록의 크기를 기록하는 추가 정보를 포함합니다. 다른 정보에 (안심하게) 액세스 할 수 없으며 –-)도 안됩니다.

를 호출 free()하면 추가 정보를보고 블록의 크기를 확인합니다.


답변

C 메모리 할당 함수의 대부분의 구현은 각 블록에 대한 계정 정보를 인라인 또는 개별적으로 저장합니다.

한 가지 일반적인 방법 (인라인)은 실제로 요청한 메모리와 헤더를 모두 최소 크기로 채우는 것입니다. 예를 들어, 20 바이트를 요청하면 시스템은 48 바이트 블록을 할당 할 수 있습니다.

  • 크기, 특수 마커, 체크섬, 다음 / 이전 블록에 대한 포인터 등을 포함하는 16 바이트 헤더.
  • 32 바이트 데이터 영역 (20 바이트는 16의 배수로 채워짐)

귀하에게 제공된 주소는 데이터 영역의 주소입니다. 그런 다음 블록 free을 비울 때 단순히 주소를 지정하고 해당 주소 나 주변 메모리를 채우지 않았다고 가정하면 회계 정보를 바로 확인하십시오. 그래픽으로 보면 다음과 같습니다.

 ____ The allocated block ____
/                             \
+--------+--------------------+
| Header | Your data area ... |
+--------+--------------------+
          ^
          |
          +-- The address you are given

헤더와 패딩의 크기는 완전히 구현 정의되어 있습니다 (실제로 전체가 구현 정의 되어 있지만 (a) 인라인 회계 옵션이 일반적입니다).

계정 정보에 존재하는 체크섬 및 특수 마커는 종종 “메모리 아레나 손상”또는 “더블 프리”와 같이 오류를 덮어 쓰거나 두 번 해제하면 오류의 원인이됩니다.

패딩 (할당을보다 효율적으로 만들기 위해)은 때때로 문제를 일으키지 않고 요청 된 공간의 끝을 약간 넘어 쓸 수있는 이유입니다 (여전히 그렇게하지 마십시오. 정의되지 않은 동작이며 때로는 작동하기 때문에 작동하지 않습니다) t는 괜찮습니다).


(a)malloc 128 바이트 이하를 요청했다고 가정 할 때 (시스템에서 가장 큰 구조의 크기 인) 128 바이트를 갖는 임베디드 시스템에서 구현을 작성 했습니다 (더 많은 요청은 NULL 반환 값을 충족해야합니다. 128 바이트 청크의 할당 여부를 결정하기 위해 매우 간단한 비트 마스크 (즉, 인라인이 아닌)가 사용되었습니다.

내가 개발 한 다른 사람들은 16 바이트 청크, 64 바이트 청크, 256 바이트 청크 및 1K 청크에 대해 다른 풀을 사용했으며 비트 마스크를 사용하여 다시 사용하거나 사용 가능한 블록을 결정했습니다.

이 두 옵션은 회계 정보의 오버 헤드를 줄이고 속도 증가 관리 mallocfree우리가 작업하던 환경에서 특히 중요합니다 (해제 할 때 인접한 블록을 병합 할 필요).


답변

로부터 comp.lang.c자주 묻는 질문 목록 : 어떻게 확보하기 위해 얼마나 많은 바이트를 무료로 알고는 무엇입니까?

malloc / free 구현은 할당 된 각 블록의 크기를 기억하므로 해제 할 때 크기를 상기시킬 필요가 없습니다. (일반적으로 크기는 할당 된 블록에 인접하게 저장되므로 할당 된 블록의 경계가 약간 초과 된 경우에도 일반적으로 문제가 발생합니다)


답변

이 답변은 free ()가 할당 해제 할 메모리 양을 어떻게 알 수 있습니까? 에서 재배치되었습니다 . 나는 명백한 중복 질문으로 대답하지 못하게 막혔다. 이 답변은이 복제본과 관련이 있어야합니다.


의 경우 malloc, 힙 할당자는 free나중에 리턴 된 메모리에 필요한 관련 세부 사항에 대한 원래 리턴 포인터의 맵핑을 저장합니다 . 이것은 일반적으로 메모리 영역의 크기를 사용중인 할당 자와 관련된 모든 형태, 예를 들어 원시 크기, 또는 할당을 추적하는 데 사용되는 이진 트리의 노드 또는 사용중인 메모리 “단위”의 수로 저장합니다.

free포인터의 이름을 바꾸거나 어떤 식 으로든 복제해도 실패하지 않습니다. 그러나 참조 횟수는 계산되지 않으며 첫 번째 값만 free정확합니다. 추가 free는 “더블 프리”오류입니다.

free이전에 반환 된 값과 다른 값을 가진 포인터를 사용 하려고 시도 malloc했지만 아직 해제되지 않은 것은 오류입니다. 에서 반환 된 메모리 영역을 부분적으로 해제 할 수 없습니다 malloc.


답변

관련 참고 사항 GLib 라이브러리에는 암시 적 크기를 저장하지 않는 메모리 할당 기능이 있으며 size 매개 변수를 free로 전달하면됩니다. 이것은 오버 헤드의 일부를 제거 할 수 있습니다.


답변

malloc()그리고 free()그것은 특정의 대답을하기 어렵다 있도록 시스템 / 컴파일러 의존한다.

이 다른 질문에 대한 자세한 정보 .


답변

힙 관리자는 호출했을 때 어딘가에 할당 된 블록에 속하는 메모리 양을 저장했습니다 malloc.

나는 한 번도 직접 구현하지는 않았지만 할당 된 블록 바로 앞에있는 메모리에 메타 정보가 포함될 수 있습니다.