Personally, this is how I (more or less) do it:
- unique_ptrs are for sole ownership
- raw pointers mean whoever gave me the raw pointer guarantees the lifetime of that object to match or exceed my lifetime.
- shared_ptrs are for shared ownership
- weak_ptrs are for when a system wants to check if the object still exists before using it. This is rare in my code since I find it cleaner to have a system guarantee the lifetime of anything it passes it’s subsystems (in which case I use a raw pointer)
By far I use more unique_ptrs than shared_ptrs, and more raw pointers than weak pointers.