轻松或严格的指针安全?

时间:2014-08-10 11:57:22

标签: c++ pointers

我遇到了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;
}

代码甚至无法编译。

demo

2 个答案:

答案 0 :(得分:1)

这个东西是允许垃圾收集的实现,虽然我不知道任何编译器(至少在主流)使用它。

表面上你可以使用std::get_pointer_safetythis appears ill-supp orted as well来查明你的是否这样做。

我说要忽略它。

答案 1 :(得分:0)

来自cppference.com的C++ preprocessor

有这个预定义的宏: STDCPP_STRICT_POINTER_SAFETY (C ++ 11)

如果实现具有严格的std :: pointer_safety,则

扩展为1 (宏常数)

我怀疑在实现库/编译器支持之前,可能首先实现(并设置为0)。