我遇到过这些relaxed/strict pointer safety概念,并且它是实现定义的,无论实现是宽松还是严格的指针安全。我的问题是关于现代实现:clang 和 g++ 是否具有严格或宽松的指针安全?
我想澄清以下关于严格指针安全概念的事情。有一个报价(第 3.7.4.3/4 节):
或者,一个实现可能具有严格的指针安全性,在这种情况下,指向具有动态存储持续时间的对象的指针值不是安全派生的指针值是无效的指针值,除非引用的完整对象先前已声明为可达(20.7 .4)。
这个限制对我来说完全不清楚。此外,我尝试使用cplusplus.com 示例对概念进行实验
// declare_reachable / undeclare_reachable example
#include <iostream>
#include <memory>
#include <cstdint>
int main() {
int * p = new int (1); // dynamic object
std::declare_reachable(p);
p = (int*)((std::uintptr_t)p ^ UINTPTR_MAX); // scrambling p
// dynamic object not reachable by any live safely-derived pointer
p = std::undeclare_reachable((int*)((std::uintptr_t)p ^ UINTPTR_MAX));
// p is back again a safely-derived pointer to the dynamic object
std::cout << "p: " << *p << '\n';
delete p;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
代码甚至无法编译。
这个东西是为了允许垃圾收集的实现,尽管我不知道有任何编译器(至少在主流中)使用了它。
表面上,您可以使用 来了解您的是否这样做std::get_pointer_safety,但这似乎也不受支持。
我会说忽略它。