shared_ptr swap problems