동적 메모리 할당(malloc)과 할당해제(free) 정리

duckkuri·2020년 10월 20일
0

42Seoul_Libft_Story

목록 보기
18/22

들어가는 이야기

ft_lstdelone 함수 main 부분을 짜던 중 자꾸 버그가 난다.
해결을 위해 이것저것 만져보던 도중, 지금 직면한 문제와 시도하는 방법들이 정확히 모른 채 고치기에만 급급해 있다는 것을 느꼈다.

현재 직면한 오류메시지명"BAD_ACCESS"
분명 메모리할당과 관련 된 버그인게 분명하다. 심지어 이전에도 동적 메모리 할당 사용 미숙으로 인한 버그를 맞닥뜨린지 그리 오래 되지도 않았다.

현재 직면한 문제와, 부족했던 개념들을 다시 살펴보고 정리한 뒤 넘어가고자 한다.

BAD_ACCESS

대부분의 BAD_ACCESS는 다음중에서 발생한다고 한다.
- NULL 포인터를 역참조 하려고 할때
- 읽기 전용 메모리에 쓰기 접근을 하려고 할때

만약 포인터가 NULL인 경우 다음을 참고하자.
- 할당이 해제된 메모리 사용
- C배열 또는 다르 종류의 버퍼 끝을 지나서 wirte하려 할때
- 초기화 되지 않은 포인터를 사용 할때

참고 링크
: https://riptutorial.com/ko/ios/example/16684/%EB%94%94%EB%B2%84%EA%B9%85-exc-bad-access

정적 메모리 할당(Static Memory Allocation)

  • 정적 메모리는 메모리크기를 고정시켜서 할당 받는다.

  • 할당 시켜줘야 할 메모리의 한계를 명확히 알고 있을때 사용한다.

  • 정적 메모리 할당은 프로그램 시작에 미리 고정시켜서 할당된다.

  • 정적으로 메모리 할당할때는 최대 사용가능하다고 생각되는 메모리보다 약간 더 크게 잡는게 보통이다.

  • 때문에 메모리 낭비가 발생할 수 있다.

  • 그러나 크기의 한계를 알 수 있는 경우, 동적 메모리 할당보다 사용하기가 쉽고 버그가 발생할 확률도 적기 때문에 자주 사용한다.

  • 보통 프로젝트를 진행하게 될 경우 약간의 메모리 낭비보다는 버그 발생을 더 큰 위험요소라고 생각하기에 가능한 정적 메모리를 사용하려고 한다.

  • 동적 메모리 할당을 사용할 경우 메모리 누수, 혼동되는 포인터의 사용에 의한 잘못된 메모리 참조 등 여러가지 문제를 발생 시킨다.

동적 메모리 할당(Dynamic Memory Allocation)

  • 동적 메모리는 프로그램 실행중에 동적으로 메모리 크기를 할당시켜줘야 하는 경우 사용한다.

  • malloc()함수는 메모리 상의 연속적인 일정 크기의 공간을 할당 받기 위해 사용하는 가장 일반적인 함수다.

  • malloc()함수는 인자로 할당받고자 하는 크기를 byte단위로 명시한다.

  • 메모리 할당에 성공하면 malloc함수는 할당된 함수의 시작위치를 가리키는 포인터를 리턴한다.

  • 할당되지 않은 포인터에 데이터를 입력할 경우 임의의 주소에 어떤값을 입력하는 꼴이된다.

  • 운이 좋으면임의의 주소에 데이터를 확보할 공간이 있어서 에러 없이 실행될 수도 있다.

  • 그렇지 않다면 다른 프로세스가 사용하고 있는 메모리 영역을 침범할 수가 있다.

  • 이런 경우, 먼저 메모리 영역을 확보하고 있던 프로세스가 메모리 우선권이 있다.

  • 이때 이 메모리 영역에 데이터를 사용하려고하는 프로세스를 강제 종료시킨다. (세그폴트 에러)

운이 좋아 에러없이 실행될 때
위에서는 운이 좋다고 표현을 하였으나, 운이 오히려 나쁜경우다. 언뜻보기에 정상적으로 잘 동작되는 코드로 보여서 디버깅 작업이 어려워지기 때문이다. 하지만 다른 코드의 메모리 영역을 침범할 가능성을 가진 불완전한 코드이다. 이런 버그를 내버려 둔다면 프로그램이 잘돌다가 어느날 갑자기 죽을 확률이 크다.

메모리 할당 해제 : free()

  • malloc은 메모리 할당을 커널에 요청하는 시스템 함수이다.

  • 그로므로 일단 malloc에 의해서 할당받은 메모리는 프로세스가 종료될때 까지 커널에 의해서 보호 받는다.

  • 이 말은 malloc을 잘못 사용할 경우 쓸때없는 메모리가 낭비 될 가능성이 있다는 뜻이다.

  • 심각한 경우 메모리 누수를 가져올 수도 있다.

메모리 누수 (memory leak)

컴퓨터 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상

할당 된 메모리를 사용 후 반환되지 않은 것이 누적되면 메모리 낭비가 된다.

즉, 불필요한 메모리 할당을 해제하지 않으면서, 메모리 관리를 잘못할 때 발생된다.
(출처 : 위키피디아)

  • 메모리 누수는 프로그램과 시스템에 치명적인 결과를 가져올 수 있다.
  • 특히 컴파일러에서 처리해 주지 않기 때문에 나중에 문제점을 찾기 힘들다.
  • 메모리 누수가 있는 프로그램은 흔히말하는 몇일 잘돌다 죽는 프로램이 될 수 있다.

참고 링크 :
https://www.joinc.co.kr/w/Site/C/Documents/malloc

profile
😤 Today I Learned

0개의 댓글