namespace std {
void declare_reachable(void* p);
}
この関数はC++23で削除された。
概要
ポインタが到達可能であることを宣言する。
要件
ポインタp
がSafely-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
処理系
- GCC: ?
- Clang: 3.4 (relaxed実装) ✅
- ICC: ?
- Visual C++: 2010 ✅, 2012 ✅, 2013 (relaxed実装) ✅