指针是一个指向内存中存储某个变量的地址。如果你对指针进行解引用操作,就能访问指针指向的变量。指针实际上是一个基础变量,它不知道 它所指向的值是否有效,也不能感知其指向的值是否无效。在C语言中,一个指针指向0,说明其不指向任何值,因此也不具有有个有效的值。所有其他指针都应该 指向内存中有意义的地址。但实际上,有些指针没有正确的初始化,或者干脆越出了应有的范围。
在C++11中,将指针正确初始化为0的方法是使用关键字nullptr。这让计算机知道该指针当前为空。另外,还有一种常用的方式是将0定义为 NULL或者其他定义或声明。C++11中使用nullptr统一了这种方式。C++中还引入了引用,它看起来像是变量的别名,其优势是使用引用的时候必 须先初始化,因此,在引用生命周期起始时需要指向一个有效地址。不过,引用也只是指针的解引用,所以,一旦其引用的变量作用范围结束,其引用也无效了,使 用指针时,你可以将指针置为0,但是针对引用却不能这么做。
但是在C++11和在C++11标准之前,一些事情发生了变化,指针是语言的核心概念,但是你在现代化的C++代码和函数库中却很少看到它们。远在 C++11之前,boost创建了一系列非常有用的智能指针类,针对指针进行了封装,对其核心机制通过操作符重载。智能指针本身不是一个指针,而是一个栈 上的变量或对象成员。智能指针使用了RAII来解决指针的一些问题,这并不是指针的职责。当在椎中分配内存时,new返回了指向该部分内存的地址,所以每 分配一块动态内存,就需要使用一个指针,相当于创建对象的一个操作句柄。但是指针仅仅是一个简单的变量,不知道变量的拥有关系,也不能自动释放堆上的内存 空间。智能指针担当了这一角色,拥有指针并在变量超出作用域时自动管理其堆上的值。在栈上的值意味着,一旦相应的栈被销毁,其管理的堆上的值会被自动释 放,即使是在发生异常的情况下。
网友评论