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