在C++ - 是否可以将易失性shared_ptr与 nullptr 进行比较

In C++ - is it possible to compare volatile shared_ptr to nullptr?

本文关键字:ptr nullptr 比较 shared 易失性 C++ 是否      更新时间:2023-10-16

似乎shared_ptr实现中的volatile比较函数不存在。

存在的意义吗?

基本上不,该标准不满足volatile shared_ptr上的比较或布尔转换。

以下编译失败...

auto main() -> int {
    volatile shared_ptr<int> a;
    if (a == nullptr) // fails
        ; // empty
    if (a) // fails
        ; // empty
}

你可以抛弃volatile(通过一个const_cast(,但我不确定这会产生预期的结果。从 cpp 首选项:

通过非const访问路径修改const对象,并通过非volatile glvalue引用volatile对象会导致未定义的行为。

更一般地说,在不将成员方法标记为volatile时,类或库实现者实际上是在说"这不是为了用作volatile对象"——如果是,那么适当的方法或重载将提供volatile对象。类似地,这也适用于const,在将成员标记为const时,他们说"这个类可以用作const对象。

为什么需要volatile,哪些外部来源可以"在编译器不知情的情况下"修改shared_ptr(这是volatile的用途之一(?如果存在线程问题,那么最好使用线程库实用程序,或者如果要求只是关闭优化,则各种编译器已经有这方面的机制(编译指示等(。

易失性只是向编译器指示内存可能会意外更改。 关闭某些优化。 在盖子下面,它只是一个内存地址。

共享指针只是保存/管理资源。 也就是说,由于 std::shared_ptr:get(( 没有标记为易失性,因此您不能真正使用 shared_ptr 以可访问的方式管理易失性指针。

我建议使用裸指针,并使用作用域出口或析构函数对其进行清理。

如果使用易失性,因为指针可能被另一个线程修改,则可能需要考虑使用 std::atomic 而不是易失性。 在线程工作流中,在 std::atomic 之前,从其他线程访问的指针通常标记为易失性。 这不再是最佳做法。