-
[메모리] 메모리 할당과 해제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 - valgrind라는 프로그램을 사용하면 지금 내가 작성한 코드에서 메모리 누수가 발생되고 있는지 확인할 수 있다.