unique_ptr과 반대로 shared ownership을 제공하는 포인터

모든 스마트 포인터는 RAII컨셉을 제공해야하기 때문에
여러 포인터가 객체를 가리키지만 언제 객체를 해제시켜줘야 하는지 알고있다.
이는 reference count를 통해 만들어지는데
이는 객체를 가리키는 reference가 몇 개인지 추적하는 방식으로 동작하는데 총 reference개수가 0이 되면 distructor를 호출한다.
#include <iostream>
#include <memory>
class Cat
{
public:
Cat()
{
std::cout << "cat constructor" << std::endl;
}
~Cat()
{
std::cout << "cat destructor" << std::endl;
}
std::shared_ptr<Cat> mFriend;
};
int main()
{
Cat * catPtr = new Cat();
Cat * catPtr1 = catPtr;
delete catPtr;
return 0;
}

이런 일반 포인터의 경우몇 개의 포인터가 Cat객체를 가리키는지 모르기 때문에 shared pointer를 사용한다.
이런 shared pointer도 실수로 memory leak이 일어나기도 한다
#include <iostream>
#include <memory>
class Cat
{
public:
Cat()
{
std::cout << "cat constructor" << std::endl;
}
~Cat()
{
std::cout << "cat destructor" << std::endl;
}
std::shared_ptr<Cat> mFriend;
};
int main()
{
std::shared_ptr<Cat> pKitty = std::make_shared<Cat>();
std::shared_ptr<Cat> pNabi = std::make_shared<Cat>();
pKitty->mFriend = pNabi;
pNabi->mFriend = pKitty;
return 0;
}

위와 같이 heap에 mFriend가 서로를 가리키게되면 총 reference 개수가 항상 1이 되므로
stack에 포인터가 해제되어도 heap의 객체는 해제되지 않아 memory leak이 일어난다.
