安全派生指针的操作包括:
1:在解引用基础上的引用,比如:&*p。
2:定义明确的指针操作,比如p + 1。
3:定义明确的指针转换,比如:static_cast<void*>(p)。
4:指针和整型之间的reinterpret_cast,比如:reinterpret_cast<intptr_t>(p)。这里的intptr_t指长度等于平台上指针的长度,由decltype声明。
C++ 11最小垃圾回收支持,基于安全派生指针这个概念,
enum class pointer_safety { relaxed, preferred, strict };
- relaxed:完全不支持垃圾回收,和C++98/03一样。
- preferred:垃圾回收器用于一些辅助功能,例如内存泄露检测或检测对象是否被一个错误的指针解引用。
- strict:编译器支持最小垃圾回收以及安全派生指针的概念。
在C++11中可以使用get_pointer_safety()函数来查询编译器是否支持这个特性。如果返回值是strcit则表示支持最小垃圾回收。
pointer_safety type = get_pointer_safety();
C++11允许程序员通过一些API来通知垃圾回收器不得回收该内存。可以使用垃圾回收的术语,声明该内存为“可到达”的。
void declare_reachable(void* p);
template<class T> T* undeclare_reachable(T *p) noexcept;
选择在一大片连续的堆内存上进行指针式操作,下面语句可以让垃圾回收器不关心从p开始的连续n的内存:
void declare_no_pointers(char *p, size_t n) noexcept;
void undeclare_no_pointers(char *p, size_t n) noexcept;