ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [메모리] 메모리 할당과 해제
    Stage/Computer Science 2021. 5. 31. 23:51

    학습 목표

    메모리를 할당하고 해제할 수 있다.

     

    1. 메모리 해제

    malloc 함수를 이용하여 정해진 크기만큼 메모리를 할당한 후에는 free라는 함수를 이용해서 메모리를 해제해줘야 한다.

    1.1 메모리를 해제하지 않으면?

    메모리를 해제하지 않으면 메모리에 저장한 값은 쓰레기 값으로 남게 된다.
    이 쓰레기 값들은 메모리 용량을 차지하게 돼서 메모리 낭비가 발생하게 되는데, 이런 현상을 메모리 누수라고 한다.

    help50 valgrind ./filename
    • valgrind라는 프로그램을 사용하면 지금 내가 작성한 코드에서 메모리 누수가 발생되고 있는지 확인할 수 있다.

    2. 메모리 관련 에러

    이 코드를 실행시켜 보자.

    #include <stdlib.h>
    
    void f(void)
    {
        int *x = malloc(10 * sizeof(int));
        x[10] = 0;
    }
    
    int main(void)
    {
        f();
        return 0;
    }
    • f함수를 보면, 우선 malloc(10 * sizeof(int))함수를 살펴보면 10 * 4(int는 4바이트), 40크기의 메모리를 할당한다.
    • 다음으로 x의 10번째 인덱스에 0을 할당한다.
    • 코드를 실행하고, 이 코드를 valgrind를 써서 확인해보면, 버퍼 오버플로우, 메모리 누수 두 가지 에러를 확인할 수 있다.

    2.1 버퍼 오버플로우

    버퍼 오버플로우는 x[10] = 0; 이 코드 때문에 발생한다.
    int *x = malloc(10 * sizeof(int)); 이 코드에서 알 수 있듯이 int 타입으로 10개의 배열을 만들었는데, 이는 0부터 9까지의 인덱스가 있다는 것을 의미한다.
    x[10]에 0을 할당하면 인덱스 10은 11번째 값에 0을 할당하겠다는 의미인데, 11번째에 해당하는 인덱스를 정의하지 않았으므로 오버 플로우가 발생한 것이다.
    이 오류는 인덱스를 알맞게 다시 조절하면 해결할 수 있다.



    2.2 메모리 누수

    메모리 누수는 malloc 함수를 이용해 할당한 메모리를 해제하지 않아서 발생한 것이다.
    메모리 누수는 간단하게 free(x)라는 코드를 추가해주면 해결할 수 있다.

    'Stage > Computer Science' 카테고리의 다른 글

    [메모리] 파일 쓰기  (0) 2021.06.01
    [메모리] 메모리 교환, 스택, 힙  (0) 2021.06.01
    [메모리] 문자열 복사  (0) 2021.05.31
    [메모리] 문자열 비교  (0) 2021.05.31
    [메모리] 문자열  (0) 2021.05.31

    댓글