gpt4 book ai didi

c++ - 在 unordered_map 中保存 shared_ptr - 立即调用析构函数

转载 作者:行者123 更新时间:2023-11-27 23:40:29 45 4
gpt4 key购买 nike

我正在为我的 websocket 编写中央连接处理程序的订户。这是一个循环引用,因为每个订阅者都需要使用相同的连接处理程序对象,我用 weak_ptr 解决了这个问题。在我的连接处理程序类中,我有一个添加订阅者的函数:

template<typename T>
void ROSBridgeClient::addSubscriber(std::string topic, size_t buffer_size, std::function<void(std::shared_ptr<T>)> cb)
{
if (subscribers.find(topic) != std::end(subscribers))
{
std::cout << "Not adding subscriber: subscriber with topic '" << topic << "\n";
return;
}
auto sub = std::make_shared<subscriber::RBCSubscriber<T>>(shared_from_this(), topic, ..., cb);
subscribers[topic] = sub;
}

订阅者是 map

std::unordered_map<std::string, std::weak_ptr<subscriber::SubscriberBase>> subscribers;

SubscriberBaseRBCSubscriber<T> 的基类.

现在,或多或少一次 addSubscriber函数退出,RBCSubscriber<T> 的析构函数叫做。我误解了智能指针吗?为什么 map 不是“保持活力”的指针?

在早期版本的代码中,我返回了 shared_ptr sub从上面的例子和我的测试课中“保持活力”,一切正常。我只是不确定为什么调用析构函数,即使指针的生命周期尚未结束,因为它保存在映射中。

最佳答案

从你的代码中我可以看到你正在 addSubscriber 方法下创建你的 shared_ptr 并将 weak_pointer 存储在 map 中。 std::weak_ptr 不会延长生命周期。因此,一旦您退出方法,您唯一的强引用 - 在方法堆栈上的“sub”就会被销毁。

关于c++ - 在 unordered_map 中保存 shared_ptr - 立即调用析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55446604/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com