본캠프 15일차_C++ 문법(8)_자원 관리

YU YEON WON·2025년 8월 25일

1. 오늘 학습 내용(키워드)

오늘은 스택/힙 메모리, Dangling Pointer, Memory leak 등을 배웠다.
컴퓨터 메모리는 한정된 자원이므로, 이를 효율적으로 활용하기 위해 다양한 고민이 필요하다.
http://windsworld.co.kr/htm14/d140529.htm

  • 스택메모리
    • 일반 변수들은 대부분 스택 메모리 공간을 차지한다.
    • 스택 메모리의 가장 큰 특징은, 변수의 생존 주기가 끝나면 선언 시 할당되었던 메모리가 자동으로 회수된다는 점이다.
    • 위와 같은 특징으로 사용자가 직접 메모리를 해제할 필요가 없다.
    • 변수의 생존 주기는 {변수의 생존 영역}과 같이 선언된 라인을 기준으로 가장 가까운 마침괄호{}이다.

      스택 메모리는 메모리를 자동으로 회수해 주는 장점이 있는 반면, 단점도 존재한다. 가장큰 단점은 다음과 같다.
    • 일반적으로 할당 가능한 스택 메모리의 크기가 제한적이다.
    • 변수의 스코프(생존 영역)을 벗어나면 자동으로 해제되므로, 메모리를 더 길거나 유연하게 관리하기 어렵다.

      이러한 문제를 해결하기 위해 힙 메모리를 사용할 수 있다.
  • 힙 메모리
    • 동적 할당 시 new 연산자를 사용하고, 해제 시 delete연산자를 사용한다.
    • 스택과 달리 자동으로 해제되지 않으므로 메모리 누수 등의 위험이 있을 수 있다.
    • 동적 할당된 객체(또는 변수)의 생존 주기는 사용자가 delete로 해제할 때까지 유지된다.
  • Dangling Pointer
    • 포인터는 메모리가 해제되었는지 여부를 자동으로 알 수 없기 때문
    • 이미 해제된 메모리의 주소를 계속 가지고 있는 포인터를 사용하는 것은 매우 위험하다.
    • 이런 포인터를 Dangling Pointer라고 부른다.
      https://www.scaler.com/topics/c/dangling-pointer-in-c/
  • Memory leak
    • 동적으로 할당된 메모리를 사용한 후 제대로 해제하지 않으면, 계속해서 사용하지 않는 메모리가 쌓이게 된다.
    • 이렇게 되면 프로그램이 점점 더 많은 메모리를 차지하게 되어 결국 사용할 수 있는 메모리가 부족해진다.
    • 이런 현상을 메모리 누수(Memory leak)라고 부른다.
    • 사용하지 않는 영역을 해제하지 않고 계속해서 메모리 할당을 하다 보면, 더 이상 사용 가능한 메모리가 없을 수 있다.
      https://www.nextree.io/memory-leak/
  • 스마트 포인터
    • Heap메모리는 여러 가지 장점들을 제공하지만 메모리를 직접 관리해야 한다는 부담이 있다.
    • Dangling Pointer가 발생하지 않도록 자동으로 관리해 주면 아주 좋을 것이다.
    • 이를 해결하기 위해 스마트 포인터라는 기능이 있다.
    • 스마트 포인터의 핵심 원리는 new/delete를 사용하지 않는 자동 메모리 관리이다. 각 스마트 포인터의 목적에 맞게 자동으로 메모리 관리를 한다.
    • unique_ptr
      • 단일 소유권 모델
      • 하나의 포인터만 특정 객체를 소유할 수 있음
      • 복사 불가능, 이동(move)만 가능
    • shared_ptr
      • 공유 소유권 모델
      • 여러 포인터가 하나의 객체를 공유할 수 있음
      • 참조 카운팅을 통해 마지막 소유자가 사라질 때 객체 삭제
    • weak_ptr
      - shared_ptr과 함께 사용
      - 객체에 대한 접근은 가능하지만 소유권은 가지지 않음
      - 순환 참조 문제 해결에 사용
      https://how.dev/answers/what-are-smart-pointers

2. 느낀점

코드를 읽는(해독)하는 것이 중요한 것 같다. 읽을 줄 알아야 쓸 수 있을 것 같다.
새로운 유형의 코딩 문제를 볼 때, 낯선 함수, 키워드가 나오면 당황하는 것 같다. 읽고 해석하는 연습을 지속적으로 해야겠다.

3. 내일 학습 할 것

STL 개념 숙지, 3번째 과제(인벤토리 만들기) 수행

profile
🕹️🎮🍱✈️📸 안녕하세요! 게임개발에 도전하고 있습니다!

0개의 댓글