首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在unordered_map中保存shared_ptr -立即调用析构函数

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

Stack Overflow用户
提问于 2019-04-01 08:09:18
回答 1查看 317关注 0票数 0

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

代码语言:javascript
复制
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; 
}

其中订阅者是地图

代码语言:javascript
复制
std::unordered_map<std::string, std::weak_ptr<subscriber::SubscriberBase>> subscribers;

SubscriberBaseRBCSubscriber<T>的基类。

现在,只要addSubscriber函数退出,RBCSubscriber<T>的析构函数就会被调用。我是不是误解了这些聪明的指针?为什么地图不是“活着”的指针?

在代码的早期版本中,我从上面的示例中返回了shared_ptr sub,并在我的测试类中“保持它的活动状态”,一切都正常工作。我只是不确定为什么调用析构函数,即使指针的生命周期还没有结束,因为它保存在map中。

EN

回答 1

Stack Overflow用户

发布于 2019-04-01 09:04:32

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55446604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档