shared_ptr はどちらかと言うと,実行時オーバーヘッドを許してでも
(使わないかも知れない) 多くの機能をデフォルトで提供する,という設計思想ではないですかね?
具体的には, deleter の動的指定, thread-safe as an int のための排他処理, weak_ptr への対応とか.
もちろんこれらのオーバーヘッドが必要になる文脈は限定的ですけれど.