본문 바로가기

Programming/C

C 언어 | 메모리 할당과 해제

학습 목표

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

 

메모리 할당과 해제

malloc() 함수를 이용하여 메모리를 할당한 경우 저장한 값이 필요가 없어지면 쓰레기 값으로 남는다. 이를 메모리 누수(memory leak)라고 한다. 메모리 누수를 방지하기 위해서는 free() 함수를 이용해 메모리를 해제해줘야 한다.

 

메모리 누수에 관련된 예제를 보자.

 

 

프로그램을 살펴보자.

  • f 함수를 보면 포인터 x에 malloc() 함수를 사용해 메모리를 할당한다.
  • 메모리의 크기는 int 형(4바이트)의 10배로 40바이트를 할당한다.
  • x의 10번째 인덱스에는 0을 할당한다.
  • main 함수에서는 f 함수를 실행시키고 0을 반환한다.

 

이 프로그램의 메모리 누수를 확인해보자. valgrind라는 메모리 누수 확인 프로그램을 사용하면 문제를 쉽게 알아낼 수 있다.

 

 

CS50 IDE의 help50과 valgrind를 사용했다.

*help50은 디버깅 방법 중 하나로 오류를 해석하는 프로그램이다. 사용하지 않아도 상관없다.

 

코드의 에러는 버퍼 오버플로우('Invalid write of size 4')와 메모리 누수('40 bytes in 1 block are definitely lost in loss record 1 of 1 at 0x483B7F3') 두 가지다.

 

버퍼 오버플로우는 'x[10] = 0;'코드로 인해 발생한다. 배열에 할당한 메모리는 10개인데 x[10]은 11번째 인덱스에 접근한다는 의미기 때문이다. 이는 0에서 9 사이의 인덱스만을 사용하면 해결할 수 있다.

 

메모리 누수는 malloc() 함수로 메모리 할당 후 해제해주지 않았기 때문에 발생한다. x 포인터에 할당된 메모리를 free() 함수로 해제하면 해결할 수 있다.

 

 

 

문제를 해결한 모습이다. 배열의 인덱스는 메모리를 할당한 대로 0에서 9 사이를 사용하고, free() 함수를 추가해 메모리를 해제시켰다.

 

생각해보기

제한된 메모리를 가지고 프로그래밍을 할 때 메모리를 해제하지 않으면 어떤 문제가 발생할까?

 

os가 제공하는 메모리 공간

malloc()과 같은 함수를 사용하면 힙(heap) 영역에 메모리가 동적으로 할당된다. 이때 할당된 메모리를 free()와 같은 함수로 해제하지 않으면 메모리 누수가 발생한다.

 

 

 

사진 출처 및 메모리 공간 관련 포스팅

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com


 

이 글은 네이버 부스트 코스 David J. Malan(데이비드 J. 말란) 교수님의 모두를 위한 컴퓨터 과학(CS50 2019) 강의를 수강하고 작성한 글입니다. 본 강좌 내 실습에서는 CS50 Sandbox를 사용합니다.

 

 

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

부스트코스 무료 강의

www.boostcourse.org

 

'Programming > C' 카테고리의 다른 글

C 언어 | 파일 쓰기와 읽기  (0) 2021.02.22
C 언어 | 메모리 교환, 스택, 힙  (0) 2021.02.22
C 언어 | 문자열의 복사  (0) 2021.02.20
C 언어 | 문자열의 비교  (0) 2021.02.20
C 언어 | 문자열과 포인터  (0) 2021.02.19