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

Saving shared_ptr in unordered_map - calls destructor immediately

本文关键字:调用 析构函数 unordered ptr shared 保存 存在 map      更新时间:2023-10-16

我正在向中央连接处理程序写入我的 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,并在我的测试类中"保持活动状态",一切正常。我只是不确定为什么要调用析构函数,即使指针的生命周期还没有结束,因为它保存在地图中。

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