C언어, 메모리

d·2023년 4월 11일
0

C언어 메모리 구조

이미지 출처 : https://www.geeksforgeeks.org/memory-layout-of-c-program

C 언어의 메모리 구조는 위와같이 코드, 데이터, 힙 그리고 스택 영역으로 나누어져 있다.

스택(Stack) 영역

  • 함수의 호출과 관련된 지역 변수와 매개변수가 저장되는 영역이다.
  • 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 따라서 프로그래머가 따로 관리 하지 않아도 된다.

힙(Heap) 영역

  • 힙(heap) 영역은 사용자가 직접 관리할 수 있는 메모리 영역이다.
  • 힙 영역은 스택과 다르게 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다.
  • 힙 영역은 크기의 제약이 없다. 메모리가 충분하다면, 힙 영역은 필요한 만큼 확장될 수 있다.
  • 프로그램은 메모리 주소에 따라서 힙 데이터에 접근한다. -> 힙에 데이터가 해제되었어도 메모리 주소에 따라서 접근할 수 있다.
  • 힙 영역은 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다(사용자가 명시적으로 해제 해 주거나 프로그램이 종료되어야 한다). -> 사용이 종료된 데이터가 해제되지 않으면 프로그램이 종료될 때까지 메모리 공간을 차지한다.

메모리 릭 (Memory Leak)

이미지 출처 : https://plumbr.io/blog/memory-leaks/native-memory-leak-example

메모리 릭은 프로그램이 불필요한 메모리를 계속 점유하는 현상이다. 일반적으로 프로그램 가동 시간 혹은 사용량에 비례해서 프로그램의 메모리 사용량이 점점 늘어나는 것으로 확인할 수 있다. 메모리 릭은 힙 영역에 할당된 메모리를 해제하지 않아서 발생한다. C언어에서는 힙 영역에 동적 메모리를 할당한다. 그런데 힙 영역에 할달된 메모리는 함수호출이 종료되어도 해제되지 않는다. free() 등을 이용해서 사용이 완료된 메모리를 명시적으로 해제 해 주어야 하는데, 이 메모리가 해제되지 않으면 메모리 릭이 발생한다.

댕글링 포인터 (Dangling Pointer)

이미지 출처 : https://stackoverflow.com/questions/17997228/what-is-a-dangling-pointer

댕글링 포인터(허상 포인터)는 이미 해제된 메모리를 가르키는 포인터를 뜻한다. 동적할당된 메모리를 가리키는 포인터가 있다고 생각해보자. 포인터는 메모리가 동적할당된 공간(힙)에 정상적으로 있다고 알고 있다. 만약 여기서 동적할당된 메모리가 해제되면 해당하는 공간을 가리키던 포인터에 있는 주소 공간은 아무런 의미가 없게 된다. 이 때 포인터에 저장된 주소공간에서 데이터를 가져오면 예측 불가능한 동작을 일으킬 수 있다.

0개의 댓글