본문 바로가기
C++

포인터와 참조 / 스마트 포인터

by ji-han 2025. 1. 20.

포인터

변수의 메모리 주소를 저장하는 변수

 

  • 선언 - 데이터 타입 뒤에 *를 사용 // ex) int* ptr;
  • 초기화 - 변수의 주소로 초기화 // ex) int* ptr = &a; (그냥 a일 경우 주소가 아닌 값을 가리키기 때문에 &을 사용하여 a의 주소값으로 초기화)
  • 역참조 - 포인터가 가리키는 주소의 값을 접근 // ex) int value = *ptr
  • 포인터 연산 - 포인터는 주소를 가리키기 때문에 값의 연산이 아닌 주소의 연산을 함
  • 동적 메모리 할당과 해제를 통해 메모리를 효율적으로 관리 // 할당 - new, 해제 - delete

메모리 관리, 데이터 구조, 함수 호출, 다형성 등 다양한 상황에서 사용되며, 효율적이고 유연한 프로그래밍을 가능하게 하지만 메모리 누수, 불안정성 등의 문제를 초래할 수 있음

참조

변수에 대한 별칭, 변수의 다른 이름처럼 동작

  • 선언 - 데이터 타입 뒤에 &을 사용 // ex) int& ref = a;
  • 초기화 - 선언과 동시에 초기화해야 하며 변수에 대한 참조만 가능
  • 사용 - 변수를 사용하는 것과 동일하게 동작
  • 불변 - 초기화된 변수와 항상 연결되어 있으며 다른 변수에 대한 참조로 변경할 수 없음

포인터에 비해 더 안전하고, 가독성을 높이며 값의 복사를 피함으로써 성능을 향상시키는데 도움을 줌

불변성을 유지하면서 효율적인 데이터 전달 및 조작이 가능

* 함수의 매개변수 같은 특정 값을 가져와야할 때 사용함으로써 값의 복사를 피하는 것으로 성능을 향상시킬수 있는 것 같음

 

스마트 포인터

동적 메모리 관리를 자동화하여 메모리 누수를 방지하고 메모리 관리의 복잡성을 줄여줌

  1. std::unique_ptr - 특정 자원을 하나의 스마트 포인터만 소유 가능, 소유권을 이동할 수는 있지만 복사는 할 수 없음
  2. std::shared_ptr - 여러 개의 인스턴스가 같은 자원을 공유할 수 있으며 모든 인스턴스가 소멸되면 자원이 해제
  3. std::weak_ptr - shared_ptr이 소유한 자원을 참조하지만 소유권을 가지지 않음
  4. std::auto_ptr - unique_ptr로 대체 되었음
  5. std::scoped_ptr - unique_ptr로 대체 되었음

선택 기준

  • std::unique_ptr - 리소스의 단독 소유권이 필요하고, 소유권을 복사할 필요가 없을 때
  • std::shared_ptr - 리소스를 여러 곳에서 공유하고 자동으로 메모리를 관리하고 싶을 때
  • std::weak_ptr - 순환 참조를 방지하고 싶을 때

소유권 - 스마트 포인터가 메모리를 관리하고 자원의 생명 주기를 책임지는 것을 의미

'C++' 카테고리의 다른 글

Overlap 매개변수  (0) 2025.02.12
STL 반복자(연산)  (0) 2025.01.27
STL 컨테이너  (0) 2025.01.14
C++ 함수들  (0) 2024.12.31
Vector<Template>, Map  (2) 2024.12.27