在C++ - 是否可以将易失性shared_ptr与 nullptr 进行比较
In C++ - is it possible to compare volatile shared_ptr to nullptr?
似乎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 之前,从其他线程访问的指针通常标记为易失性。 这不再是最佳做法。
- 如何在自删除后将对象设置为nullptr
- 如何取消对nullptr的屏蔽,返回正确的对象
- C++ - "!pointer"和"pointer == nullptr"的区别?
- 将指针设置为"nullptr"并不能防止双重删除?
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 将 ptr 传递给 ptr 到 A 作为参数传递给 A 的函数是不好的做法吗?
- 为什么我的节点在我设置后被设置为 nullptr = 新节点?
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 为共享 ptr 向量实现复制 c'tor?
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 字符和整数中 **(ptr+1) 的值差异
- C++:在不中断共享的情况下通过引用传递共享 PTR?
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- wx通用目录控制错误"wxTheFileIconsTable was nullptr"
- 当设置为 const 变量时使用 nullptr
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- 在 gtest 中比较 ptr 和 nullptr