精通Cocos2d-x游戏开发(基础卷)
上QQ阅读APP看书,第一时间看更新

5.4 智能指针和空指针

智能指针是类而非一般指针。shared_ptr是一引用计数指针,一个shared_ptr只有在已经没有任何其他shared_ptr指向其原本所指向的对象时,才会销毁该对象。

除了shared_ptr外,还有weak_ptr,但weak_ptr并不拥有其所指向的对象,因此不影响该对象的销毁与否,也不能对weak_ptr解引用,只能判断该指针是否已被销毁。

int main ()
{
    //智能指针只能被智能指针赋值,不能用 shared_ptr<int> p1 = new int;
    shared_ptr<int> p1 (new int);
    //用{}进入一个新的作用域
    {
       //新的智能指针指向p1,这时相当于对int内存块的一次retain
        shared_ptr<int> p2 = p1;
        *p2 = 123;
   //p2被销毁,相当于对int内存块的一次release,但由于p1还指向内存,引用计数不为0,
因此不会释放
}
return 0;
//p1也销毁,这时引用计数为0,int所占用的内存块被自动回收
}

如果将shared_ptr定义为类的成员变量,那么该智能指针的retain引用会在该对象被释放时才释放。

空指针nullptr的存在是为了解决NULL的二义性问题,因为NULL也可以代表0。nullptr的类型为nullptr_t,能隐式转换为任何指针或是成员指针的类型,也能和它们进行相等或不等的比较。而nullptr不能隐式转换为整数,也不能和整数做比较

void foo(char*);
void foo(int);

使用空指针NULL和nullptr调用foo函数的结果如下:

foo(NULL);              //执行的是foo(int)
foo(nullptr);   //执行的是foo(char*)