diff --git a/clients/roscpp/src/libros/callback_queue.cpp b/clients/roscpp/src/libros/callback_queue.cpp index aed7c16283..813d0d7c00 100644 --- a/clients/roscpp/src/libros/callback_queue.cpp +++ b/clients/roscpp/src/libros/callback_queue.cpp @@ -359,8 +359,12 @@ CallbackQueue::CallOneResult CallbackQueue::callOneCB(TLS* tls) ROS_ASSERT(!tls->callbacks.empty()); ROS_ASSERT(tls->cb_it != tls->callbacks.end()); - CallbackInfo info = *tls->cb_it; - CallbackInterfacePtr& cb = info.callback; + // Alias the CallbackInfo object via reference (rather than copying it) + CallbackInfo& info = *tls->cb_it; + // Increment the reference count of the shared pointer of the + // CallbackInterface to make sure it is not destroyed while we wait for + // the mutex lock. + CallbackInterfacePtr cb = info.callback; IDInfoPtr id_info = getIDInfo(info.removal_id); if (id_info)