std::unique_ptr provides unique ownership semantics safely. However that doesn’t rule out the need for non-owning pointers. std::shared_ptr has a non-owning counterpart, std::weak_ptr. Raw pointers operate as std::unique_ptr‘s non-owning counterpart.