From 7cd842953435d83cd9c12f1ddf20e5da34e14420 Mon Sep 17 00:00:00 2001 From: Shane Loretz Date: Tue, 1 May 2018 12:59:15 -0700 Subject: [PATCH] Fini arguments passed to rcl_node_init() (#468) * Fix memory leak in node_base * Always free arguments --- rclcpp/src/rclcpp/node_interfaces/node_base.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/rclcpp/src/rclcpp/node_interfaces/node_base.cpp b/rclcpp/src/rclcpp/node_interfaces/node_base.cpp index 46aaf4b..f57c807 100644 --- a/rclcpp/src/rclcpp/node_interfaces/node_base.cpp +++ b/rclcpp/src/rclcpp/node_interfaces/node_base.cpp @@ -117,6 +117,14 @@ NodeBase::NodeBase( if (ret != RCL_RET_OK) { // Finalize the interrupt guard condition. finalize_notify_guard_condition(); + // Finalize previously allocated node arguments + if (RCL_RET_OK != rcl_arguments_fini(&options.arguments)) { + // Print message because exception will be thrown later in this code block + RCUTILS_LOG_ERROR_NAMED( + "rclcpp", + "Failed to fini arguments during error handling: %s", rcl_get_error_string_safe()); + rcl_reset_error(); + } if (ret == RCL_RET_NODE_INVALID_NAME) { rcl_reset_error(); // discard rcl_node_init error @@ -183,6 +191,15 @@ NodeBase::NodeBase( // Indicate the notify_guard_condition is now valid. notify_guard_condition_is_valid_ = true; + + // Finalize previously allocated node arguments + if (RCL_RET_OK != rcl_arguments_fini(&options.arguments)) { + // print message because throwing would prevent the destructor from being called + RCUTILS_LOG_ERROR_NAMED( + "rclcpp", + "Failed to fini arguments: %s", rcl_get_error_string_safe()); + rcl_reset_error(); + } } NodeBase::~NodeBase()