In the internal details of the implementation, when owning pointers complicate the interaction, when it is necessary to divide ownership, but the lifetime of the object is clearly determined and there is no question: where and when to clean an object ( shared_ptr in such cases is superfluous), when the link is not enough, because the situation is possible with nullptr on the object. In public APIs, try to avoid as long as possible, or clearly substantiate - "why?" and for what?".
In general, I adhere to the rule: do without raw pointers, as long as it is possible. Not yet let down (embedded).
By the way, it is probably funny, but in C projects, upon reaching a certain level of complexity, shared ownership mechanisms also begin to appear. These are the well-known xxx_ref(object) / xxx_unref(object) . Examples: GLib with its gobject, FFmpeg actively implements reference counting for AVPacket and AVFrame ( intrusive_ptr exists in Boost for such cases), the Linux kernel also does not stand aside ( https://lwn.net/Articles/336224/ according to the word Reference Counting or http://www.makelinux.net/books/lkd2/ch17lev1sec7 ) with your kobject .