From cd839663b4ec8c1a8b6e405c1dd91da7cf903095 Mon Sep 17 00:00:00 2001 From: Chris Lalancette Date: Fri, 11 Aug 2017 05:45:25 -0700 Subject: [PATCH] Fix memory leaks in rclcpp (#354) * Make sure to delete service_handle when in the Service() destructor. Signed-off-by: Chris Lalancette * Make sure to delete the allocated rcl_node on error paths. This all happens *before* we setup the shared_ptr destructor, so we have to hand delete in the error paths. Signed-off-by: Chris Lalancette * Move delete rcl_node up. It turns out that we are always going to throw in that block, and we never access rcl_node, so just delete it very early on. Signed-off-by: Chris Lalancette --- rclcpp/include/rclcpp/service.hpp | 1 + rclcpp/src/rclcpp/node_interfaces/node_base.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/rclcpp/include/rclcpp/service.hpp b/rclcpp/include/rclcpp/service.hpp index 621e900..7279dc3 100644 --- a/rclcpp/include/rclcpp/service.hpp +++ b/rclcpp/include/rclcpp/service.hpp @@ -172,6 +172,7 @@ public: (std::cerr << ss.str()).flush(); rcl_reset_error(); } + delete service_handle_; } } diff --git a/rclcpp/src/rclcpp/node_interfaces/node_base.cpp b/rclcpp/src/rclcpp/node_interfaces/node_base.cpp index 3c9c8ed..f5cbed4 100644 --- a/rclcpp/src/rclcpp/node_interfaces/node_base.cpp +++ b/rclcpp/src/rclcpp/node_interfaces/node_base.cpp @@ -92,6 +92,8 @@ NodeBase::NodeBase( // Finalize the interrupt guard condition. finalize_notify_guard_condition(); + delete rcl_node; + if (ret == RCL_RET_NODE_INVALID_NAME) { rcl_reset_error(); // discard rcl_node_init error int validation_result;