直接mRequestVector.emplace_back(msg);和Message *msg = new Message(*this);后再mRequestVector.emplace_back(msg);有什么区别
时间: 2024-06-11 18:07:12 浏览: 71
直接调用mRequestVector.emplace_back(msg)将Message对象的指针添加到mRequestVector中,而使用Message *msg = new Message(*this)创建了一个新的Message对象并将其指针添加到mRequestVector中。因此,区别在于是否创建了新的Message对象。如果使用前者,添加到mRequestVector中的指针将指向原始Message对象,如果后者,将创建一个新的Message对象并添加其指针到mRequestVector中。
相关问题
auto it = plugin_subscriptions.find(msgid); if (it == plugin_subscriptions.end()) { // new entry ROS_DEBUG_STREAM(log_msgname << " - new element"); plugin_subscriptions[msgid] = PluginBase::Subscriptions{{info}}; } else { // existing: check handler message type bool append_allowed = is_mavlink_message_t(type_hash_); if (!append_allowed) { append_allowed = true; for (auto &e : it->second) { auto t2 = std::get<2>(e); if (!is_mavlink_message_t(t2) && t2 != type_hash_) { ROS_ERROR_STREAM(log_msgname << " routed to different message type (hash: " << t2 << ")"); append_allowed = false; } } } if (append_allowed) { ROS_DEBUG_STREAM(log_msgname << " - emplace"); it->second.emplace_back(info); } else ROS_ERROR_STREAM(log_msgname << " handler dropped because this ID are used for another message type"); }
这段代码看起来像是 C++ 的一个消息订阅系统,用于处理消息的路由和分发。它首先检查是否已经有一个订阅相同消息 ID 的处理程序,如果没有则创建一个新的订阅列表并添加当前处理程序;如果已经存在,则检查当前处理程序处理的消息类型是否与已有处理程序处理的类型相同,如果不同则不允许添加当前处理程序,否则将当前处理程序添加到订阅列表中。在这个过程中,代码使用了 STL 中的 map 和 vector 容器来存储订阅信息。
阅读全文