函式
<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


另見