스마트 포인터는 동적으로 할당된 메모리 관리를 해줄 수 있다. 메모리 누수(memory leak) 같은 문제를 방지 할 수 있다.
std::shared_ptr
여러 스마트 포인터 객체가 하나의 동적 할당된 메모리를 공유할 수 있다.
이 객체는 참조 카운트(reference count)를 유지하며, 해당 메모리를 참조하는 모든 shared_ptr 객체가 파괴될 때마다 참조 카운트가 감소하며, 참조 카운트가 0이 되면 메모리가 자동으로 해제된다.
순환 참조(circular reference) 문제를 야기할 수 있어, 주의가 필요합니다.
(순환참조를 해결하기 위해서 weak_ptr를 사용할 수도 있다).
std::unique_ptr
메모리를 오직 하나의 스마트 포인터만 소유할 수 있는 포인터입니다. 복사나 이동 연산이 금지되어 소유권을 안전하게 전달하거나 반환할 수 있으며, 메모리는 unique_ptr 객체와 함께 파괴된다.
메모리의 고유 소유권을 추적하고, 복사나 이동으로 인한 문제를 방지할 수 있다. 무결성을 유지할 때 유용.
복사나 이동이 불가능하기 때문에 메모리 공유가 불가능하며, 다른 스마트 포인터와 함께 사용할 때 주의해야 함.
std::weak_ptr
weak_ptr는 shared_ptr와 함께 사용되며, 메모리를 공유하지 않고 객체의 수명을 연장하지 않고,shared_ptr가 메모리를 참조하고 있는 동안에만 weak_ptr로 메모리를 참조할 수 있다.weak_ptr은 순환 참조를 방지하면서, 메모리를 안전하게 참조할 수 있다.weak_ptr가 shared_ptr로부터 생성되었더라도, weak_ptr가 파괴되거나 shared_ptr로 변환되지 않는 한, 메모리 해제를 유발하지 않는다.weak_ptr로 직접 메모리를 사용하려면 lock() 함수를 사용하여 shared_ptr로 변환해야 한다.lock()을 사용하여 weak_ptr를 직접 사용하면, 이미 파괴된 메모리를 참조할때 nullptr를 반환하므로 유효성을 검사할 수 있다.!!!!