가능한 중복 :
C programming : How does free know how much to free?크기는 무료 성명에서 제공되지 않는 이유
모든 안녕하세요, OS가 난 경우 무료로 얼마나 많은 크기를 알게 얼마나
free (포인터)를 정의합니다. 우리는 어떤 크기도 제공하지 않고 자유 진술에 대한 포인터 만 제공한다는 의미입니다. 내부적으로 크기를 어떻게 처리합니까?
덕분에, 닐
가능한 중복 :
C programming : How does free know how much to free?크기는 무료 성명에서 제공되지 않는 이유
모든 안녕하세요, OS가 난 경우 무료로 얼마나 많은 크기를 알게 얼마나
free (포인터)를 정의합니다. 우리는 어떤 크기도 제공하지 않고 자유 진술에 대한 포인터 만 제공한다는 의미입니다. 내부적으로 크기를 어떻게 처리합니까?
덕분에, 닐
OS는 무료가 시스템 호출되지 않습니다, 실마리가되지 않습니다. 그러나 C 라이브러리 메모리 할당 시스템은 원래 malloc()에 의해 메모리가 할당되었을 때 어떤 식 으로든 크기를 기록 할 것이기 때문에 얼마나 많은 메모리를 확보해야하는지 알 수 있습니다.
크기는 내부적으로 할당 자에 저장되며 사용 가능하게 전달한 포인터는 해당 데이터에 도달하는 데 사용됩니다. 아주 기본적인 접근법은 포인터 앞에 크기 4 바이트를 저장하는 것이므로 포인터에서 4를 빼는 것은 포인터의 크기를 알려줍니다.
OS가 직접 처리하지 않는다는 점에 유의하십시오.이 코드는 C/C++ 런타임 할당기에 의해 구현됩니다.
malloc을 호출하면 C 라이브러리가 자동으로 힙에 공간을 조각합니다. 힙에서 작성된 항목은 동적으로 작성되므로 특정 시점의 힙에있는 내용은 스택의 내용과 동일하지 않습니다. 따라서 라이브러리는 힙에 할당 한 모든 메모리를 추적합니다. 힙은 다음과 같이 수있는 몇 가지 지점에서
:
p---+
V
---------------------------------------
... | used (4) | used (10) | used (8) | ...
---------------------------------------
라이브러리 것은 각 블록에 할당되는 메모리의 양을 추적합니다. 이 경우 포인터 p는 가운데 블록의 시작을 가리 킵니다.
우리는 다음 호출 할 경우
free(p);
다음 라이브러리가 ... 지금과 같이, 힙에 당신을 위해
p---+
V
----------------------------------------
... | used (4) | unused(10) | used (8) | ...
----------------------------------------
을이 공간을 확보합니다, 다음 번에 당신을
void* ptr = malloc(10);
새로 할당되지 않은 공간이 프로그램에 할당 될 수 있습니다. 다시 말해 우리 프로그램에서 사용하는 전체 메모리 양을 줄일 수 있습니다.
ptr---+
V
----------------------------------------
... | used (4) | used(10) | used (8) | ...
----------------------------------------
라이브러리가 내부적으로 크기를 관리하는 방식이 다릅니다. 이를 구현하는 간단한 방법은 각 블록의 크기를 유지하기 위해 할당 된 각 블록의 시작 부분에 추가 바이트 양을 추가하는 것입니다 (이 예에서는 1이라고 말합니다).그래서 힙 메모리의 이전 블록은 다음과 같을 것이다 :
bytes: 1 4 1 10 1 8
--------------------------------
... |4| used |10| used |8| used | ...
--------------------------------
^
+---ptr
을 이제, 우리는 블록 크기를 2로 나눌 수 반올림 될 것이라고 말한다면, 그들은 우리가 크기의 끝에 여분의 비트를 (우리는 항상 우리가 편리하게 해당 블록이 사용되거나 사용되지 않는 여부를 확인하는 데 사용할 수있는 0으로 가정 할 수 있기 때문에
을 우리는 자유에 대한 포인터를 전달하는 경우 :.
이free(ptr);
도서관은 이동 것 포인터가 1 바이트 뒤로 주어지고, 사용되지 않거나 사용되지 않는 비트가 사용되지 않는 것으로 변경됩니다. 우리는 블록을 해제하기 위해 블록의 크기를 실제로 알 필요조차 없습니다. 동일한 양의 데이터를 재 할당하려고 할 때만 문제가됩니다. 그런 다음, malloc 호출은 다음 블록이 사용 가능한지 확인하기 위해 줄을 따라 내려갑니다. 여유 공간이있는 경우 올바른 크기이면 해당 블록이 사용자에게 반환되고 그렇지 않으면 힙 끝에 새 블록이 잘리고 필요하면 OS에서 더 많은 공간이 할당됩니다.
일부 implmenentations는 크기를 저장하는 청크의 일부로 크기를 저장하지 않지만 대신 메모리 주소를 크기가 저장된 내부 데이터 구조에 대한 인덱스로 사용합니다. – nos
@nos 사실,하지만이 방법은 구현할 수있는 간단한 방법이라고 생각합니다. 내가하지 않았다면, 나는 의미했다. – KLee1