我遇到了relaxed/strict pointer safety
概念,并且实现已定义实现是否已放宽或严格指针安全性。我的问题是关于现代实施:
clang和g ++是否有严格或轻松的指针安全性?
我想澄清关于严格指针安全概念的以下内容。引用(第3.7.4.3/4节):
或者,实现可能具有严格的指针安全性 在哪种情况下,指针值指的是具有动态存储的对象 不是安全派生指针值的持续时间是无效的 指针值,除非之前引用的完整对象 已宣布可达(20.7.4)。
这种限制对我来说完全不清楚。此外,我尝试使用cplusplus.com example
进行实验// 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;
}
代码甚至无法编译。
答案 0 :(得分:1)
这个东西是允许垃圾收集的实现,虽然我不知道任何编译器(至少在主流)使用它。
表面上你可以使用std::get_pointer_safety
,this appears ill-supp orted as well来查明你的是否这样做。
我说要忽略它。
答案 1 :(得分:0)
来自cppference.com的C++ preprocessor
有这个预定义的宏: STDCPP_STRICT_POINTER_SAFETY (C ++ 11)
如果实现具有严格的std :: pointer_safety,则扩展为1 (宏常数)
我怀疑在实现库/编译器支持之前,可能首先实现(并设置为0)。