Das hat mit Parameter und Rückgabewert nicht viel zu tun. Sondern damit, wem ein Objekt gehört.
Gehört es mehreren Eltern-Objekten oder nur einem?
Beispiel:
Mein Auto gehört meiner Freundin und mir. Wir müssen beide tot sein (oder es beide freigeben), damit es niemandem mehr gehört. Meine Hose gehört aber nur mir. Auch wenn meine Freundin die manchmal in die Waschmaschine wirft, nur ich darf die Hose in den Müll werfen.
Genau das ist auch die Entscheidung, die bei Smart-Pointern zu treffen ist. Jeder, dem ein Objekt nicht gehört, es aber braucht (meine Freundin braucht die Hose, damit sie sie waschen kann), bekommt eine "Benutzungserlaubnis", was einem (Raw-)Pointer oder einer Referenz darauf entspricht. Freigeben dürfen aber nur die Owner. Wenn alle Owner das Objekt freigegeben haben, löscht der Smartpointer das Ding. Alle anderen Nutzer müssen natürlich garantiert tot sein bevor die Owner tot sind, sonst greift der Nutzer auf einen gelöschten Pointer zu - hier also nix neues, das war ja schon immer so.
Ein Besitzer: unique_tr
Mehrere: shared_ptr
usw.