포인터
변수의 메모리 주소를 저장하는 변수
- 선언 - 데이터 타입 뒤에 *를 사용 // ex) int* ptr;
- 초기화 - 변수의 주소로 초기화 // ex) int* ptr = &a; (그냥 a일 경우 주소가 아닌 값을 가리키기 때문에 &을 사용하여 a의 주소값으로 초기화)
- 역참조 - 포인터가 가리키는 주소의 값을 접근 // ex) int value = *ptr
- 포인터 연산 - 포인터는 주소를 가리키기 때문에 값의 연산이 아닌 주소의 연산을 함
- 동적 메모리 할당과 해제를 통해 메모리를 효율적으로 관리 // 할당 - new, 해제 - delete
메모리 관리, 데이터 구조, 함수 호출, 다형성 등 다양한 상황에서 사용되며, 효율적이고 유연한 프로그래밍을 가능하게 하지만 메모리 누수, 불안정성 등의 문제를 초래할 수 있음
참조
변수에 대한 별칭, 변수의 다른 이름처럼 동작
- 선언 - 데이터 타입 뒤에 &을 사용 // ex) int& ref = a;
- 초기화 - 선언과 동시에 초기화해야 하며 변수에 대한 참조만 가능
- 사용 - 변수를 사용하는 것과 동일하게 동작
- 불변 - 초기화된 변수와 항상 연결되어 있으며 다른 변수에 대한 참조로 변경할 수 없음
포인터에 비해 더 안전하고, 가독성을 높이며 값의 복사를 피함으로써 성능을 향상시키는데 도움을 줌
불변성을 유지하면서 효율적인 데이터 전달 및 조작이 가능
* 함수의 매개변수 같은 특정 값을 가져와야할 때 사용함으로써 값의 복사를 피하는 것으로 성능을 향상시킬수 있는 것 같음
스마트 포인터
동적 메모리 관리를 자동화하여 메모리 누수를 방지하고 메모리 관리의 복잡성을 줄여줌
- std::unique_ptr - 특정 자원을 하나의 스마트 포인터만 소유 가능, 소유권을 이동할 수는 있지만 복사는 할 수 없음
- std::shared_ptr - 여러 개의 인스턴스가 같은 자원을 공유할 수 있으며 모든 인스턴스가 소멸되면 자원이 해제
- std::weak_ptr - shared_ptr이 소유한 자원을 참조하지만 소유권을 가지지 않음
- std::auto_ptr - unique_ptr로 대체 되었음
- 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 |