[C++] 메모리 동적 할당 및 해제 - malloc, calloc, realloc, free

    malloc

    동적으로 메모리를 할당하는 함수

    #include <stdlib.h>
    
    void* malloc(size_t size)

    메모리 크기를 바이트 단위로 넘기면 그 크기만큼 메모리가 할당되고 할당된 메모리의 첫 번째 바이트의 주소가 반환된다.

    메모리 할당에 실패할 경우 NULL이 반환된다.

     

    개발자가 어떤 데이터 형으로 저장하는지 알 수 없기 때문에 void* 형을 반환하고, 개발자는 사용 용도에 맞게 변환하여야 한다.

     

    malloc 함수 사용 예시

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int arr[10];
        int* arr_ptr;
        
        for(int i = 0; i < 10; ++i)
        {
        	arr[i] = i;
        }
        
        arr_ptr = (int*)malloc(sizeof(int)*10); // 배열의 크기만큼 할당하기 위해 배열의 요소 크기만큼 곱함
        
        for(int i = 0; i < 10; ++i)
        {
        	arr_ptr[i] = arr[i];
            printf("%d", arr_ptr[i]);
        }
        
        return 0;
    }

     

    calloc

    malloc 함수와 기능은 같되 사용법이 다르다. 변수의 크기를 n개만큼 할당해달라고 지정할 수 있다.

    #include <stdlib.h>
    
    void* calloc(size_t elt_count, size_t elt_size)

    malloc 함수는 메모리를 할당할 때 메모리 공간의 값을 바꾸지 않지만

    calloc 함수는 메모리 공간의 값을 0으로 초기화 시킨다.

     

    calloc 함수 사용 예시

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int arr[10];
        int* arr_ptr;
        
        for(int i = 0; i < 10; ++i)
        {
        	arr[i] = i;
        }
        
        arr_ptr = (int*)calloc(10, sizeof(int)); // int 형의 변수를 10개 저장할 수 있는 메모리 할당
        
        for(int i = 0; i < 10; ++i)
        {
        	arr_ptr[i] = arr[i];
            printf("%d", arr_ptr[i]);
        }
        
        return 0;
    }

     

    realloc

    이미 할당된 메모리의 크기를 바꿀 때 사용하는 함수

    #include <stdlib.h>
    
    void* realloc(void* memblock, size_t size)

    메모리 크기를 바꿀 포인터와 할당할 크기를 넘겨 사용한다.

     

    realloc 함수 사용 예시

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int arr[10];
        int* arr_ptr;
        
        for(int i = 0; i < 10; ++i)
        {
        	arr[i] = i;
        }
        
        arr_ptr = (int*)calloc(5, sizeof(int)); // 일단 5개가 들어갈 공간만 할당
        for(int i = 0; i < 5; ++i)
        {
        	arr_ptr[i] = arr[i];
            printf("%d", arr_ptr[i]);
        }
        
        (int*)realloc(arr_ptr, 10); // int 형 변수 10개가 들어갈 공간만큼 재할당
        
        for(int i = 0; i < 10; ++i)
        {
        	arr_ptr[i] = arr[i];
            printf("%d", arr_ptr);
        }
        
        return 0;
    }

    realloc 함수를 사용할 때 주의할 점이 있는데 메모리 할당에 실패했을 때 NULL이 반환되기 때문에 기존의 메모리가 할당되어 있던 포인터를 잃어버릴 수 있다. 그렇게 되면 기존에 할당된 메모리를 해제할 수 없게되어 메모리 누수로 이어진다.

     

    free

    할당된 메모리를 해제하는 함수. 더이상 사용하지 않는 메모리라면 해제해줘야 메모리가 부족하지 않다.

    #include <stdlib.h>
    
    void free(void* ptr)

     

    free 함수 사용 예시

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int arr[10];
        int* arr_ptr;
        
        for(int i = 0; i < 10; ++i)
        {
            arr[i] = i;
        }
        
        arr_ptr = (int*)calloc(10, sizeof(int));
        for(int i = 0; i < 10; ++i)
        {
            arr_ptr[i] = arr[i];
            printf("%d", arr_ptr[i]);
        }
        
        free(arr_ptr); // 메모리 해제
        
        return 0;
    }

    댓글