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

时间:2019-04-01 00:09:18

标签: c++

我正在向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; 
}

订户是地图

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

SubscriberBaseRBCSubscriber<T>的基类。

现在,addSubscriber函数退出时或多或少会调用RBCSubscriber<T>的析构函数。我会误会智能指针吗?为什么地图不“保持活动”指针?

在该代码的早期版本中,我从上述示例返回了shared_ptr sub,并在测试类中“将其保持有效”,并且一切正常。我只是不确定为什么调用了析构函数,即使指针的生命期还没有结束,因为它已保存在地图中。

1 个答案:

答案 0 :(得分:3)

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