谁拥有期货和承诺中的共享国家?特别是谁负责构建和删除这些类中的共享状态?或者共享状态应该被引用计数?通过在cppreference上阅读这些文档,我无法得到答案。
我正在考虑的方式最简单的方法是让std::promise
类负责创建共享状态,然后将其交给std::future
,即{}在未来被销毁时从std::promise
获取以进行删除。但是这种方法可能导致悬挂的承诺对象。所以我不确定这两者之间应该分享这个州的真实情况。
例如,下面的代码是否会产生未定义的行为(因为未来被销毁时可能会破坏共享状态)?
auto prom = std::promise<void>{};
{
auto fut = prom.get_future();
}
prom.set_value();
此外,关于cppreference的std::promise::~promise
的文档说“如果共享状态已准备好,则将其释放”,这让我认为共享状态不是引用计数。
答案 0 :(得分:7)
当std::future
(或std::promise
)被销毁时,会释放其共享状态。
This rule指出,当异步返回对象或异步提供程序被称为释放其共享状态时,它会放弃对共享状态的引用。
如果该引用是最后一个,则共享状态将被销毁。
所以是的,共享状态似乎是引用计数而不是,您的代码示例不会产生UB,因为prom
仍然保持对共享状态的引用。