在C ++中 - 是否可以将volatile shared_ptr与nullptr进行比较?

时间:2016-03-31 13:22:24

标签: c++ shared-ptr volatile

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

存在是否有意义?

2 个答案:

答案 0 :(得分:4)

基本上不行,该标准不适合volatile shared_ptr上的comparisonsboolean conversion

要编译的following fails ...

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

您可以关闭volatile(通过。const_cast),但我不确定是否会产生预期结果。来自cppreference

  

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

更一般地说,在不将成员方法标记为volatile时,类或库实现者实际上是在说“这不是用作volatile对象” - 如果是,然后适当的方法或重载将提供volatile个对象。同样,这适用于const,在将成员标记为const时,他们会说“此类可用作const对象。

为什么需要volatile,在没有编译器知识的情况下,外部资源可以修改shared_ptr“(这是volatile的用法之一)?如果存在线程问题,那么你可以更好地使用一个线程库实用程序,或者如果需求只是关闭优化,各种编译器已经有了这种机制(pragma等)。

答案 1 :(得分:3)

Volatile只是指示编译器内存可能会意外更改。关闭一些优化。在封面下它只是一个内存地址。

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

我建议使用裸指针,并使用范围退出或destructer来清理它。

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