본문 바로가기
cs/CS50

5: 메모리-4(메모리 할당과 해제)

by 이쟝 2021. 12. 3.

지난 시간에 malloc이라는 메모리 할당 함수를 이용해서 EMMA를 복사하는데 필요한 메모리 공간을 할당받고 for 루프를 통해 문자열을 복사했음

 

malloc의 반대는 free라는 함수 

 "free": 할당되었던 메모리를 다시 반환해서  프로그램이 더 많은 메모리를 사용할 수 있게 함

malloc 함수를 이용해 메모리를 할당한 후에는 free라는 함수를 이용해 메모리를 해제해줘야 함

그렇지 않을 경우 메모리 저장한 값은 쓰레기 값으로 남게 되어 메모리 용량의 낭비가 발생하고 이러한 현상을 '메모리 누수'라고 함

 

valgrind라는 프로그램을 사용하면 작성한 코드에서 메모리와 관련된 문제가 있는지를 쉽게 확인할 수 있음

help 50 valgrind ./filename

 

이와 같은 명령어를 사용하면 filename 파일에 대한 valgrind의 검사 내용을 쉽게 확인할 수 있음


예시 코드

#include <stdlib.h>

void f(void)
{
    int * x = malloc(10 * sizeof(int));
    x[10] = 0;
}

int main(void)
{
    f();
    return 0;
}

 

f 함수의 포인터 x에는 int형의 사이즈(4바이트) 10배에 해당하는 크기의 메모리, 즉 40 바이트를 할당함

그리고 x의 10번째 값으로 0을 할당함

main 함수에서 f를 실행하게 되는데, 이 코드를 valgrind로 검사해보면

1) 버퍼 오버플로우

2) 메모리 누수

이 두 가지 에러를 확인할 수 있음

- 1번은 x[10] = 0; 코드로 인해 발생함

10개의 int형의 배열을 만들었는데 배열의 인덱스는 0부터 시작하기 때문에 인덱스 10은 11번째 인덱스에 접근하겠다는 의미이고, 이는 정의되지 않았기 때문에 버퍼 오버플로우가 발생하는 것

따라서 이 오류는 0에서 9 사이의 인덱스를 사용하면 해결 가능!

- 2번은 메모리 할당한 것을 해제하면 됨

메모리 누수는 x라는 포인터를 통해 할당한 메모리를 해제하기 위해 free(x); 라는 코드를 추가해주면 해결 가능! 

 

void f(void)
{
    int * x = malloc(10 * sizeof(int));
    x[9] = 0;
    free(x);
}

 

https://www.boostcourse.org/cs112/joinLectures/41307

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org