. 9.9.1 malloc과 free함수
본문 바로가기
프로그래밍 공부/CSPP

9.9.1 malloc과 free함수

by 불냥이_ 2021. 1. 15.

 C언어 표준 라이브러리는 malloc 이라는 명시적인 할당기를 많이 쓴다. 이 함수로 힙으로부터 블록들을 할당받는다.

우선 어떤 함수인지 보고가자.

#include <stdlib.h>
void *malloc(size_t size);
Returns: pointer to allocated block if OK, NULL on error

 

size_t 만큼의 포인터를 반환한다는 뜻이다. 구체적인 예는 아래와 같다.

typedef struct _NODE
{
    int cnt;
    bool leaf;
    bool root;
    int key[2 * t - 1];

    struct _NODE *child[2 * t];
    struct _DATA *dataAdress[2 * t];

    struct _NODE *prevPtr;
    struct _NODE *nextPtr;
} NODE;


NODE *Allocate()
{
    NODE *new_node = (NODE *)malloc(sizeof(NODE));
    new_node->prevPtr = NULL;
    new_node->nextPtr = NULL;
}

필자가 B+트리 구현을 했던 당시 (불과 어제이지만)의 코드이다. 

Allocate 함수를 보자. 

 

NODE *new_node = (NODE *)malloc(sizeof(NODE));

NODE만큼의 사이즈를 malloc함수를 통해 메모리에서 할당받는다. 그리고 그 할당받은 메모리의 주소를 NODE 포인터 형태로 new_node라는 이름으로 반환한다. 

 

이것이 malloc 함수이다.

 

할당받는 메모리의 크기는 32비트에서는 주소가 8의 배수이며, 64비트에서는 16의 배수이다.

/* 이는 최소단위의 메모리 크기가 32비트에는 8바이트, 64비트에서는 16바이트라는 것을 의미한다. 최소 사이즈가 작으면 작을수록 더 공간을 효율적으로 관리할 수 있을 것같은데 왜 64비트에서는 늘어난 것일까?

 

이는 램 기술의 발달로 요즈음에는 8GB는 기본으로 다는 시대가 되었다. 그래서 공간적인 효율은 그다지 중요하지 않아지고 시간효율성을 추구하게 된 결과가 아닐까?

 

예를 들어 40바이트의 공간이 필요하다고 하자.

그렇다면 32bit에서는 8바이트의 블록을 5번 계산할 것이다. 그러나 64bit에서는 16바이트의 공간을 3번 계산할 것이다. 물론 이렇게 하면 16*3-40 = 8바이트의 공간이 낭비될 것이지만 계산 횟수가 절반가까이 줄어든다. */

 

 

 

만약 malloc으로 배정받은 메모리를 초기화하고 싶다면 calloc함수를, 사이즈를 변경하고 싶다면 realloc을 사용할 수 있다. 그리고 더 이상 할당받은 메모리가 필요하지 않다면 free 함수로 반납할 수 있다. 

#include <stdlib.h>
void free(void *ptr);
Returns: nothing

 

free 함수는 간단한 것 같지만, 리턴할 때 아무것도 반환하지 않기 때문에 런타임 에러를 유발할 수 있다. 어떤식으로 런타임에러를 유발하는 지는 아래의 그림을 보자. 

 

그림 1. malloc, free가 작동하는 방식

 

그림 1을 보면 malloc과 free가 작동하는 방식을 알 수 있다. 

한칸은 int의 사이즈를 나타낸 것이며, p1은 4*sizeof(int)를 할당하므로 4칸을 할당한다. 

 

또한, malloc과 free에 넣는 인자는 할당할 (혹은 할당받은) 메모리의 시작 ptr(포인터)를 넣어야됨을 유의하자.

 

(b)의 경우에서 p2에 5칸의 메모리를 할당받았다.

그리고 (d)에서 할당받은 메모리를 반환하고, (e)에서 p4에 새로운 메모리를 할당받았다.

 

그러나 p2는 그대로 남아있기 때문에 유저가 p2를 반환한 사실을 까먹고 만약 p2에 대해서 다시 free를 시행한다면, 엉뚱한 p4의 메모리 할당이 반납되게 될 것이다. 

 

 

댓글0