最終更新日時:
が更新

履歴 編集

function
<memory>

std::declare_reachable(C++11)

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;
}

出力

100

バージョン

言語

  • C++11

処理系

参照