这是我的问题的一个简化版本。我使用的是boost::asio,我有一个函数可以处理传递给它的一些数据,但我想将处理延迟5秒。这就是我实现它的方式。
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的最后一个引用。但这里面有很多猜测,这导致了这个问题。
发布于 2021-07-27 00:14:46
正如您所说的,以这种方式管理您的自定义对象的生命周期是完全正确的。您可以在async asio tutorials中查看一些高级示例。它们不使用lambas,但基本工作流程是相同的:让asio通过在完成处理程序中存储共享指针来处理生命周期。
https://stackoverflow.com/questions/68532603
复制相似问题