1. 절대 new와 delete를 사용하지 마세요. 포인터가 객체를 소유하고 있는지 여부는 매우 명확해야 합니다. 만약 포인터가 객체를 소유하고 있다면(예를 들어, 객체를 생성하고 있다면), 스마트 포인터를 사용하여 make_unique 또는 make_shared를 사용하세요.
2. 기본적으로 오버헤드가 거의 없기 때문에 unique_ptr을 사용하세요. 여러 소유자가 있어야 한다는 것을 알고 있다면 shared_ptr을 사용하세요.
3. 포인터가 객체를 소유하지 않을 때는 원시 포인터를 사용하세요. 예를 들어, 객체를 함수에 전달할 때 수신한 포인터는 객체를 소유하지 않으므로(함수가 반환되면 객체는 여전히 살아 있을 것입니다) 스마트 포인터를 전달하지 말고 원시 포인터를 전달하세요. 함수의 원시 포인터로 unique_ptr을 전달하려면, 가장 좋은 방법은 참조를 해제하고 참조로 전달하는 것입니다. 따라서 함수는 예를 들어 "void foo(const Class & myObject)"이며, "foo(*myPointer)"라고 부릅니다. 다른 방법으로는 "unique_ptr.get()" 메서드를 사용하여 주소 자체를 전달하는 것입니다.
4. 다시 말해서, 원시 포인터에서 delete를 사용하지 말고 객체를 소유하지 않는다고 가정하세요.
5. 함수 내부에 객체를 생성하고 반환하려면 unique_ptr로 수행합니다. receiver는 함수를 사용하여 원하는 모든 작업을 수행할 수 있습니다. 이제 함수에서 로컬 객체를 복사하여 전달하면 실제로 복사하는 것이 아니라 r-value로 이동한다는 점을 명심하세요. 따라서 컴파일러 오류 없이 새로운 unique_ptr로 이동합니다. 다시 말하지만, receiver는 원하는 모든 작업을 수행할 수 있으므로 shared_ptr 또는 원시 포인터로 이동할 수 있습니다.
6. unique_ptr의 소유권을 이전하고 싶을 때는 std::move()를 사용하여 r-value로 할 수 있습니다. 이것이 기본적으로 함수에서 돌아올 때 C++가 하는 일이라고 설명한 것입니다. 함수로 소유권을 이전하는 데 사용할 수 있습니다.
아직 명확하게 감이 잡히진 않기에, 나중에 직접 사용하게 되는 경우가 있다면 그 때 느낀 점들을 추가적으로 기록해 두어야 할 거 같다.