[C++] unique_ptr, shared_ptr

개요

c++에서는 new로 동적 할당을 하게 되면 delete를 반드시 해줘서 메모리 누수가 없도록 해야한다.

따라서 메모리 해제를 자동으로 해주는 스마트 포인터를 대안으로 사용하는데 스마트 포인터란 메모리를 참조하는 레퍼런스 카운트를 저장하고 카운트가 0이 되면 메모리를 해제하는 포인터이다.

기본적인 동적할당말고 c++에서 제공해주는 스마트 포인터가 있는데 바로

  • unique_ptr
  • shared_ptr

unique_ptr

unique_ptr은 레퍼런스 카운트가 최대 1인 스마트포인터이다.

따라서 복사나 대입이 불가능하고 대신 move를 통해 소유권을 이전하는게 가능하다.

알아야 할 건

  • 선언 및 동적 할당 : std::unique_ptr<class> ptr1 = std::make_unique<class>();
  • 소유권 이전 : std::unique_ptr ptr2 = move(ptr1);
#include <iostream>
#include <memory>

int main() {
	std::unique_ptr<Animal> u_anim1 = std::make_unique<Dog>(); //동적 할당
    u_anim1->makeSound();
    
    auto u_anim2 = move(u_anim1); //move를 통한 소유권 이전
    if (u_anim1) u_anim1->makeSound(); //실행되지 않음
	u_anim2->makeSound();

사용처

게임에서 레벨이나 씬 등 하나만 존재해야 하는 것을 동적 할당 할 때 사용하면 유용하다.

shared_ptr

shared_ptr은 레퍼런스 카운트가 n개 까지 가능하다.

알아야 할 건

  • 선언 및 동적 할당: std::shared_ptr<class> ptr1 = std::make_shared<class>();
  • 레퍼런스 카운트 확인: ptr1.use_count()
  • 포인터 해제 : ptr1.reset()
int main(){
   std::shared_ptr<Animal> ptr1 = std::make_shared<Dog>(); //동적 할당
   std::cout << ptr1.use_count() << "\n"; //레퍼런스 카운트 확인
   auto ptr2 = ptr1; //참조
   std::cout << ptr1.use_count() << "\n";
   ptr1.reset(); //참조 해제
   std::cout << ptr2.use_count() << "\n"  

} //범위 벗어나면 메모리 자동 해제

사용처

게임에서 텍스처, 오디오 등 동시에 여러군데 참조가 필요한 경우 사용한다,

보통 포인터로 사용하던 것을 메모리적으로 안정적으로 사용하고 싶다면 사용하자!

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

[C++]STL stack  (0) 2024.12.29
[C++] STL Map  (1) 2024.12.23
[C++]템플릿 사용 시 파일 분할  (0) 2024.12.23
[C++] 템플릿의 특수화  (0) 2024.12.23
[C++] 연결 리스트  (1) 2024.12.23