From 16288457b6787f30df3ce436d1114546dece6cdd Mon Sep 17 00:00:00 2001 From: MARIANOCEREDA Date: Thu, 21 May 2026 20:30:40 +0000 Subject: [PATCH] Replace raw Observer* by a shared ptr as part of world. --- .../include/moveit/collision_detection/world.hpp | 8 ++++---- moveit_core/collision_detection/src/world.cpp | 11 +++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/moveit_core/collision_detection/include/moveit/collision_detection/world.hpp b/moveit_core/collision_detection/include/moveit/collision_detection/world.hpp index a3f41643b3..8e31a18885 100644 --- a/moveit_core/collision_detection/include/moveit/collision_detection/world.hpp +++ b/moveit_core/collision_detection/include/moveit/collision_detection/world.hpp @@ -289,15 +289,15 @@ class World class ObserverHandle { public: - ObserverHandle() : observer_(nullptr) + ObserverHandle() : observer_() { } private: - ObserverHandle(const Observer* o) : observer_(o) + ObserverHandle(const std::shared_ptr& o) : observer_(o) { } - const Observer* observer_; + std::weak_ptr observer_; friend class World; }; @@ -349,6 +349,6 @@ class World }; /// All registered observers of this world representation - std::vector observers_; + std::vector> observers_; }; } // namespace collision_detection diff --git a/moveit_core/collision_detection/src/world.cpp b/moveit_core/collision_detection/src/world.cpp index b2262f93d5..1eb672ea4f 100644 --- a/moveit_core/collision_detection/src/world.cpp +++ b/moveit_core/collision_detection/src/world.cpp @@ -402,7 +402,7 @@ void World::updateGlobalPosesInternal(ObjectPtr& obj, bool update_shape_poses, b World::ObserverHandle World::addObserver(const ObserverCallbackFn& callback) { - const auto o = new Observer(callback); + const auto o = std::make_shared(callback); observers_.push_back(o); return ObserverHandle(o); } @@ -411,9 +411,8 @@ void World::removeObserver(ObserverHandle observer_handle) { for (auto obs = observers_.begin(); obs != observers_.end(); ++obs) { - if (*obs == observer_handle.observer_) + if (obs->get() == observer_handle.observer_.lock().get()) { - delete *obs; observers_.erase(obs); return; } @@ -428,15 +427,15 @@ void World::notifyAll(Action action) void World::notify(const ObjectConstPtr& obj, Action action) { - for (Observer* observer : observers_) + for (const auto& observer : observers_) observer->callback_(obj, action); } void World::notifyObserverAllObjects(const ObserverHandle observer_handle, Action action) const { - for (auto observer : observers_) + for (const auto& observer : observers_) { - if (observer == observer_handle.observer_) + if (observer.get() == observer_handle.observer_.lock().get()) { // call the callback for each object for (const auto& object : objects_)