Skip to content

Latest commit

 

History

History
87 lines (64 loc) · 2.6 KB

declare_reachable.md

File metadata and controls

87 lines (64 loc) · 2.6 KB

declare_reachable

  • memory[meta header]
  • std[meta namespace]
  • function[meta id-type]
  • cpp11[meta cpp]
namespace std {
  void declare_reachable(void* p);
}

概要

ポインタが到達可能であることを宣言する。

要件

ポインタpSafely-derived Pointerか、またはヌルである。

効果

pが非ヌルである場合、pの参照するオブジェクトは到達可能であるとされる。

到達可能であるということは、万一どのポインタもpを参照しないことがあってもGCにより解放されることはなくなる。

すなわち、GCにおいてルートとして機能する。

戻り値

なし

例外

渡されたオブジェクトを追跡するために、システムが必要な追加メモリを確保しようとし、それに失敗した場合、std::bad_allocを送出する。

#include <memory>
#include <iostream>
#include <cstdlib>

// GC負荷が大きい関数のダミー定義
void some_operation_that_cause_gc() {}

int main()
{
  int* p = new int(100);
  std::declare_reachable(p);
  // `p`の参照するオブジェクトは到達可能と宣言されているので、
  // ポインタ`p`の値が変わっても元の`p`が参照していたオブジェクトは解放されない
  p += 10;

  // `std::declare_reachable(p)`がない場合、
  // 次のGC負荷が大きい関数呼び出しで、`p`が参照していたオブジェクトを解放される可能性がある
  some_operation_that_cause_gc();

  std::cout << *(p - 10) << std::endl;

  p -= 10;
  std::undeclare_reachable(p);

  return EXIT_SUCCESS;
}
  • std::declare_reachable[color ff0000]
  • std::undeclare_reachable[link undeclare_reachable.md]
  • EXIT_SUCCESS[link /reference/cstdlib/exit_success.md]

出力

100

バージョン

言語

  • C++11

処理系

参照