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.
https://stackoverflow.com/questions/18301511/stdshared-ptr-initialization-make-sharedfoo-vs-shared-ptrtnew-foo
[TR1] shared_ptr
1. auto_ptr TR1이 발표되기 전까지 std::auto_ptr이 C++ Standard library의 유일한 스마트 포인터였다. 스마트 포인터의 기본적인 특성인 자신이 소멸될 때 가리키고 있는 대상에 대해 자동으로 delete 해줘 메모리 누수 걱정은 없게 작성이 되어 있다. 하지만, auto_ptr은 유일 소유권 개념이 있어서, 객체가 복
http://egloos.zum.com/sweeper/v/2826435
![[TR1] shared_ptr](https://www.notion.so/image/http%3A%2F%2Fmd.egloos.com%2Fegloos_logo.jpg?table=block&id=824d4108-bbb3-4400-85e8-26602652d8dd&cache=v2)
코딩교육 티씨피스쿨
스마트 포인터(smart pointer) C++ 프로그램에서 new 키워드를 사용하여 동적으로 할당받은 메모리는, 반드시 delete 키워드를 사용하여 해제해야 합니다. C++에서는 메모리 누수(memory leak)로부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공하고 있습니다. 스마트 포인터(smart pointer)란 포인터처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해 줍니다.
http://tcpschool.com/cpp/cpp_template_smartPointer

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를 살펴보겠습니다.
https://itability.tistory.com/37

[TR1] weak_ptr
1. shared_ptr shared_ptr의 내용은 다음 링크를 참고하기 바라며, 특히 3-9 Circular reference 챕터를 자세히 읽어보기 바란다. (위 링크엔 shared_ptr의 circular reference에 대한 예제가 포함되어 있다) 2. weak_ptr shared_ptr은 자신이 참조하고 있는 객체(메모리 주소)에 대해
http://egloos.zum.com/sweeper/v/3059940
![[TR1] weak_ptr](https://www.notion.so/image/http%3A%2F%2Fmd.egloos.com%2Fegloos_logo.jpg?table=block&id=eaab12b9-e022-47b9-bf66-aae05c9914bf&cache=v2)
코딩교육 티씨피스쿨
스마트 포인터(smart pointer) C++ 프로그램에서 new 키워드를 사용하여 동적으로 할당받은 메모리는, 반드시 delete 키워드를 사용하여 해제해야 합니다. C++에서는 메모리 누수(memory leak)로부터 프로그램의 안전성을 보장하기 위해 스마트 포인터를 제공하고 있습니다. 스마트 포인터(smart pointer)란 포인터처럼 동작하는 클래스 템플릿으로, 사용이 끝난 메모리를 자동으로 해제해 줍니다.
http://tcpschool.com/cpp/cpp_template_smartPointer


Seonglae Cho