@@ -26,8 +26,13 @@ namespace rclcpp
2626
2727inline void copy_rcl_message (const rcl_serialized_message_t & from, rcl_serialized_message_t & to)
2828{
29- const auto ret = rmw_serialized_message_init (
30- &to, from.buffer_capacity , &from.allocator );
29+ auto ret = RCL_RET_ERROR;
30+ if (nullptr == to.buffer ) {
31+ ret = rmw_serialized_message_init (&to, from.buffer_capacity , &from.allocator );
32+ } else {
33+ ret = rmw_serialized_message_resize (&to, from.buffer_capacity );
34+ }
35+
3136 if (RCL_RET_OK != ret) {
3237 rclcpp::exceptions::throw_from_rcl_error (ret);
3338 }
@@ -78,7 +83,6 @@ SerializedMessage::SerializedMessage(rcl_serialized_message_t && other)
7883SerializedMessage & SerializedMessage::operator =(const SerializedMessage & other)
7984{
8085 if (this != &other) {
81- serialized_message_ = rmw_get_zero_initialized_serialized_message ();
8286 copy_rcl_message (other.serialized_message_ , serialized_message_);
8387 }
8488
@@ -88,7 +92,6 @@ SerializedMessage & SerializedMessage::operator=(const SerializedMessage & other
8892SerializedMessage & SerializedMessage::operator =(const rcl_serialized_message_t & other)
8993{
9094 if (&serialized_message_ != &other) {
91- serialized_message_ = rmw_get_zero_initialized_serialized_message ();
9295 copy_rcl_message (other, serialized_message_);
9396 }
9497
@@ -98,6 +101,14 @@ SerializedMessage & SerializedMessage::operator=(const rcl_serialized_message_t
98101SerializedMessage & SerializedMessage::operator =(SerializedMessage && other)
99102{
100103 if (this != &other) {
104+ if (nullptr != serialized_message_.buffer ) {
105+ const auto fini_ret = rmw_serialized_message_fini (&serialized_message_);
106+ if (RCL_RET_OK != fini_ret) {
107+ RCLCPP_ERROR (
108+ get_logger (" rclcpp" ),
109+ " Failed to destroy serialized message: %s" , rcl_get_error_string ().str );
110+ }
111+ }
101112 serialized_message_ =
102113 std::exchange (other.serialized_message_ , rmw_get_zero_initialized_serialized_message ());
103114 }
@@ -108,6 +119,14 @@ SerializedMessage & SerializedMessage::operator=(SerializedMessage && other)
108119SerializedMessage & SerializedMessage::operator =(rcl_serialized_message_t && other)
109120{
110121 if (&serialized_message_ != &other) {
122+ if (nullptr != serialized_message_.buffer ) {
123+ const auto fini_ret = rmw_serialized_message_fini (&serialized_message_);
124+ if (RCL_RET_OK != fini_ret) {
125+ RCLCPP_ERROR (
126+ get_logger (" rclcpp" ),
127+ " Failed to destroy serialized message: %s" , rcl_get_error_string ().str );
128+ }
129+ }
111130 serialized_message_ =
112131 std::exchange (other, rmw_get_zero_initialized_serialized_message ());
113132 }
0 commit comments