지난 시간에 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
'cs > CS50' 카테고리의 다른 글
5: 메모리-6(파일 쓰기와 읽기) (0) | 2021.12.06 |
---|---|
5: 메모리-5(메모리 교환, 스택,힙) (0) | 2021.12.04 |
5: 메모리-3(문자열, 문자열의 비교와 복사) (0) | 2021.12.03 |
5: 메모리-2(포인터) (0) | 2021.12.02 |
5: 메모리-1(메모리 주소) (0) | 2021.12.02 |