Keep in mind this functionality is not free. Raw pointers when handled correctly suffice in situations where the 'shared-ness' is not needed or cumbersome. Some game design books talk about using all smart pointers but most talk about using raw pointers and shared's only when absolutely necessary. Shared pointers are notoriously slower (obviously) and this might make or break some projects. However these pointers should not be created in performance critical loops but even using pre-created boost::weak_ptr's requires a call to lock(). You must check the result of lock() prior to using the returned shared_ptr and then branch execution based on the result. For me it is an issue of both and. I definitely see the benefit of smart pointers in production code and have written several containers and classes that use it, but I also see the complexity that they do add. Even boost's implementation, although quite simple once you get used to it, is not all that straightforward. The documentation for them as well is hideous. It took me some time to figure out how to force the pointers to go out of scope b/c the documentation was so unclear. Another issue I have with boost is that it is templated. I realize it has to be but the problem is that templates cause all versions of Visual Studio Intellisense to just about croak. In my experience MSVS will rarely, if ever, provide any Intellisense past weak_ptr::lock() and rarely shows anything for boost::shared_ptr. I realize this is MSVS's fault as it pertains to templates but for the time being it does make working with them, and boost, a pain.
Whatever you do, though, be sure to always use smart-pointers, and generally speaking, RAII techniques. There's absolutely no excuse for managing raw pointers "by hand"...EVER!!!