上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*)