C++11新标准为了做到最小的垃圾回收支持,首先对“安全”的指针进行了定义,安全派生的指针是指向由new分配的对象或其子对象的指针。
安全派生指针的操作包括:
1:在解引用基础上的引用,比如:&*p。
2:定义明确的指针操作,比如p + 1。
3:定义明确的指针转换,比如:static_cast<void*>(p)。
4:指针和整型之间的reinterpret_cast,比如:reinterpret_cast<intptr_t>(p)。这里的intptr_t指长度等于平台上指针的长度,由decltype声明。
在C++11中可以使用get_pointer_safety()函数来查询编译器是否支持这个特性。如果返回值是strcit则表示支持最小垃圾回收。
pointer_safety type = get_pointer_safety();
如果程序员代码中出现了指针不安全使用的状况,C++11允许程序员通过一些API来通知垃圾回收器不得回收该内存。可以使用垃圾回收的术语,声明该内存为“可到达”的。
#include <memory>
using namespace std;
int main()
{
int *p = new int(10);
declare_reachable(p); //在p被隐藏之前声明为可到达的
int*q = (int*)((long long)p ^ 2012);
//...一些操作
q = undeclare_reachable<int>((int*)((long long)q ^ 2012));
*q = 10;
}
有的时候程序员会选择在一大片连续的堆内存上进行指针式操作,为了让垃圾回收器不关心该区域,可以使用下面的两个函数:
void declare_no_pointers(char *p, size_t n) noexcept;
void undeclare_no_pointers(char *p, size_t n) noexcept;
其使用方式与declare_reachable及undeclare_reachable类似,不过指定的是从p开始的连续n的内存。