One tradeoff, I believe, If you have, say: class A { A (boost::shared_ptr<B>) boost::shared_ptr<B> B_obj; }; Then each time you use B_obj, there is additional dereference overhead IIUC. If I used with_custodian_and_ward, there should not be this additional overhead.