首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过boost::asio安全地使用shared_ptr和lambda回调

通过boost::asio安全地使用shared_ptr和lambda回调
EN

Stack Overflow用户
提问于 2021-07-26 23:30:22
回答 1查看 72关注 0票数 0

这是我的问题的一个简化版本。我使用的是boost::asio,我有一个函数可以处理传递给它的一些数据,但我想将处理延迟5秒。这就是我实现它的方式。

代码语言:javascript
复制
void process_later(boost::asio::io_service& io, const std::string& data) {
    auto timer = std::make_shared<boost::asio::steady_timer>(io);
    timer->expires_from_now(std::chrono::seconds(5));

    timer->async_wait(
        [timer,data](const boost::system::error_code&) {
            std::cout << data << std::endl;
        }
    );
}    ​

我不能完全确定这是否安全,无论是未定义的行为(例如使用前释放)还是timer的内存泄漏。

我的直觉是这是可以的。lambda捕获创建timer的副本,递增其引用计数并使其大于零。然后,boost::asio内容包含一个引用(复制?)它会一直保存到5秒后执行回调。然后,它销毁lambda,这将删除对timer的最后一个引用。但这里面有很多猜测,这导致了这个问题。

EN

回答 1

Stack Overflow用户

发布于 2021-07-27 00:14:46

正如您所说的,以这种方式管理您的自定义对象的生命周期是完全正确的。您可以在async asio tutorials中查看一些高级示例。它们不使用lambas,但基本工作流程是相同的:让asio通过在完成处理程序中存储共享指针来处理生命周期。

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

https://stackoverflow.com/questions/68532603

复制
相关文章

相似问题

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