函数
<memory>

std::declare_reachable

void declare_reachable (void* p);
声明指针可达
声明由安全派生指针p指向的对象可达,即使编译器之后无法跟踪到指向它的任何指针。

这保证了,即使在实现严格指针安全的编译器中,由p指向的动态对象在调用undeclare_reachable(值为p)之前都将保持有效。届时,可以通过调用undeclare_reachable获得相应类型的安全派生指针。

在垃圾回收实现中,调用此函数会阻止垃圾回收器销毁由p指向的动态对象,即使在某个时刻无法跟踪到指向它的任何指针或引用。

如果对同一个对象p多次调用此函数,则该对象被视为可达,直到发生相同次数的undeclare_reachable调用。

参数

p
一个安全派生指针,或一个空指针。
如果为空指针,则调用无效。

返回值



因为可能需要分配内存来跟踪p的可达性,该函数可能会抛出bad_alloc异常。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 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;
}

输出
p: 1


另见