将shared_ptr保存在unordered_map中 - 立即调用析构函数
Saving shared_ptr in unordered_map - calls destructor immediately
我正在向中央连接处理程序写入我的 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;
SubscriberBase
是 RBCSubscriber<T>
的基类。
现在,或多或少只要 addSubscriber
函数退出,就会调用 RBCSubscriber<T>
的析构函数。我是否误解了智能指针?为什么地图不是"保持活动"指针?
在早期版本的代码中,我从上面的例子中返回了shared_ptr sub
,并在我的测试类中"保持活动状态",一切正常。我只是不确定为什么要调用析构函数,即使指针的生命周期还没有结束,因为它保存在地图中。
从您的代码中,我可以看到您正在 addSubscriber 方法下创建shared_ptr并将weak_pointer存储在 map 中。 std::weak_ptr 不会延长生命周期。因此,一旦退出方法,您唯一的强引用 - 方法堆栈上的"sub"就会被销毁。
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常