C++ Smart Pointer

Creator
Creator
Seonglae ChoSeonglae Cho
Created
Created
2020 Jul 16 0:33
Editor
Edited
Edited
2024 Oct 25 19:22
Refs
Refs
C++11 이전에는 auto_ptr이라는 스마트 포인터 이후
C++ 프로그램에서 new 키워드를 사용하여 동적으로 할당받은 메모리는, 반드시 delete 키워드를 사용하여 해제해야 합니다.
C++에서는 메모리 누수(memory leak)로부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공하고 있습니다.
스마트 포인터(smart pointer)란 포인터처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해 줍니다.

c++ unique_ptr

unique_ptr은 하나의 스마트 포인터만이 특정 객체를 소유할 수 있도록, 객체에 소유권 개념을 도입한 스마트 포인터
이 스마트 포인터는 해당 객체의 소유권을 가지고 있을 때만, 소멸자가 해당 객체를 삭제할 수 있습니다.
unique_ptr 인스턴스는 move() 멤버 함수를 통해 소유권을 이전할 수는 있지만, 복사할 수는 없습니다.
소유권이 이전되면, 이전 unique_ptr 인스턴스는 더는 해당 객체를 소유하지 않게 재설정

c++ shared_ptr

shared_ptr은 하나의 특정 객체를 참조하는 스마트 포인터가 총 몇 개인지를 참조하는 스마트 포인터입니다.
이렇게 참조하고 있는 스마트 포인터의 개수를 참조 횟수(reference count)라고 합니다.
참조 횟수는 특정 객체에 새로운 shared_ptr이 추가될 때마다 1씩 증가하며, 수명이 다할 때마다 1씩 감소합니다.
따라서 마지막 shared_ptr의 수명이 다하여, 참조 횟수가 0이 되면 delete 키워드를 사용하여 메모리를 자동으로 해제합니다.

c++ weak_ptr

weak_ptr은 다음과 같은 경우에 사용하면 유용하다.
  • 어떠한 객체를 참조하되, 객체의 수명에 영향을 주고 싶지 않은 경우
  • 그리고 매번 특정 객체의 ID로 컬렉션에서 검색하고 싶지 않을 경우
  • 그러면서 dangling pointer의 잠재 위험성을 없애고 싶을 때
weak_ptr은 하나 이상의 shared_ptr 인스턴스가 소유하는 객체에 대한 접근을 제공하지만, 소유자의 수에는 포함되지 않는 스마트 포인터입니다.
shared_ptr은 참조 횟수(reference count)를 기반으로 동작하는 스마트 포인터입니다.
만약 서로가 상대방을 가리키는 shared_ptr를 가지고 있다면, 참조 횟수는 절대 0이 되지 않으므로 메모리는 영원히 해제되지 않습니다.
이렇게 서로가 상대방을 참조하고 있는 상황을 순환 참조(circular reference)라고 합니다.
weak_ptr은 바로 이러한 shared_ptr 인스턴스 사이의 순환 참조를 제거하기 위해서 사용됩니다.
auto_ptr은 C++11 표준부터 삭제
 
 
 

proper assign usage

std::shared_ptr initialization: make_shared () vs shared_ptr (new Foo)
Both examples are rather more verbose than necessary: std::shared_ptr p(new int); // or '=shared_ptr (new int)' if you insist auto p = std::make_shared (); // or 'std::shared_ptr p' if you insist What's the difference? The main difference is that the first requires two memory allocations: one for the managed object ( new int), and one for the reference count.
std::shared_ptr initialization: make_shared () vs shared_ptr (new Foo)
[TR1] shared_ptr
1. auto_ptr TR1이 발표되기 전까지 std::auto_ptr이 C++ Standard library의 유일한 스마트 포인터였다. 스마트 포인터의 기본적인 특성인 자신이 소멸될 때 가리키고 있는 대상에 대해 자동으로 delete 해줘 메모리 누수 걱정은 없게 작성이 되어 있다. 하지만, auto_ptr은 유일 소유권 개념이 있어서, 객체가 복
[TR1] shared_ptr
코딩교육 티씨피스쿨
스마트 포인터(smart pointer) C++ 프로그램에서 new 키워드를 사용하여 동적으로 할당받은 메모리는, 반드시 delete 키워드를 사용하여 해제해야 합니다. C++에서는 메모리 누수(memory leak)로부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공하고 있습니다. 스마트 포인터(smart pointer)란 포인터처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해 줍니다.
코딩교육 티씨피스쿨
new를 바로 쓰기보다는 std::make_unique나 std::make_shared를 쓰자
std::make_unique는 C++14입니다. 만약 C++11을 사용하고 있다고 하더라도 다음과 같이 std::make_unique 이 예는 약간의 노력으로 사용자가 필요하다면 make_unique를 만들 어 는 총 3개가 있습니다. make 함수는 임의의 인자를 갖습니 다. 그리고 동적으로 리고 그 객체에 대한스마트 포인터 를 반환합니다. 이러한 특성을 가지고 있는 make 함수중 std::make_shared 와 std::make_u nique를 살펴보겠습니다.
new를 바로 쓰기보다는 std::make_unique나 std::make_shared를 쓰자
[TR1] weak_ptr
1. shared_ptr shared_ptr의 내용은 다음 링크를 참고하기 바라며, 특히 3-9 Circular reference 챕터를 자세히 읽어보기 바란다. (위 링크엔 shared_ptr의 circular reference에 대한 예제가 포함되어 있다) 2. weak_ptr shared_ptr은 자신이 참조하고 있는 객체(메모리 주소)에 대해
[TR1] weak_ptr
코딩교육 티씨피스쿨
스마트 포인터(smart pointer) C++ 프로그램에서 new 키워드를 사용하여 동적으로 할당받은 메모리는, 반드시 delete 키워드를 사용하여 해제해야 합니다. C++에서는 메모리 누수(memory leak)로부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공하고 있습니다. 스마트 포인터(smart pointer)란 포인터처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해 줍니다.
코딩교육 티씨피스쿨
 
 
 
 

Recommendations