shared pointers are hard