Developer Roadmap/C++

C++ 포인터와 레퍼런스 완전 정리 : 스마트 포인터부터 메모리 누수까지

gigyesik 2025. 6. 18. 13:56
반응형

썸네일

C++ 포인터와 레퍼런스 완전 정리

C++는 강력한 메모리 제어 기능을 제공하는 언어다. 이 글에서는 C++의 핵심 개념 중 하나인 포인터(Pointer)레퍼런스(Reference)에 대해 개발자 로드맵 기준으로 정리하고, 실제 코드 예제와 함께 메모리 모델, 객체 수명, 스마트 포인터까지 상세히 설명한다.


포인터(Pointer)란?

포인터는 변수의 메모리 주소를 저장하는 변수로, *, &, new, delete 같은 키워드와 함께 사용된다.

  • int* p = &x; : x의 주소를 p가 가리킴
  • *p : 포인터가 가리키는 실제 값에 접근
  • new / delete : 동적 메모리 할당 및 해제

레퍼런스(Reference)란?

레퍼런스는 기존 변수의 또 다른 이름으로 작동한다. 반드시 초기화되어야 하며, 이후 다른 대상을 참조할 수 없다. 함수 매개변수에 주로 사용되어 참조를 통한 값 변경이 가능하다.


메모리 모델

C++ 프로그램은 메모리를 다음과 같이 사용한다:

  • 스택(Stack): 함수 내 지역 변수, 자동 해제
  • 힙(Heap): new로 할당된 동적 메모리, delete로 수동 해제
  • 데이터(Data) 세그먼트: 전역/정적 변수 저장
  • 코드(Code) 세그먼트: 실행 코드 저장 영역

객체의 수명

  • 정적(static): 전역 변수, static 변수
  • 스레드(thread_local): 스레드 종료 시까지
  • 자동(auto): 스코프 내 지역 변수
  • 동적(dynamic): new로 생성된 객체

적절한 메모리 해제를 하지 않으면 메모리 누수(Memory Leak)가 발생하므로 주의가 필요하다.


스마트 포인터(Smart Pointer)

C++11부터 도입된 스마트 포인터는 객체 수명을 자동으로 관리해준다.

unique_ptr

  • 단독 소유
  • 이동 가능(std::move)
  • 복사 불가
std::unique_ptr<int> p = std::make_unique<int>(10);

shared_ptr

  • 참조 카운트 기반
  • 여러 개의 shared_ptr가 같은 객체를 소유

weak_ptr

  • shared_ptr의 순환 참조 방지용
  • 참조 카운트에 영향을 주지 않음

메모리 누수 방지 팁

  • delete 누락 방지
  • 배열은 delete[] 사용
  • 가능하면 스마트 포인터 사용
  • RAII 패턴 활용 (생성자에서 할당, 소멸자에서 해제)

결론

C++의 포인터와 레퍼런스를 이해하면 더 안전하고 효율적인 코드 작성을 할 수 있다. 특히 스마트 포인터를 적절히 활용하면 메모리 누수 없는 안정적인 프로그램을 만들 수 있다.

반응형