一、序言
在开发过程中,见识到了cpp的指针的杀伤性,吃了不少苦头。
想要从根本上解决这个问题,需要透彻地理解指针。
二、基本知识:
在计算机中,数据是存放在内存单元中的,一般把内存中的一个字节称为一个内存单元。为了更方便地访问这些内存单元,可预先给内存中的所有内存单元进行地址编号,根据地址编号,可准确找到其对应的内存单元。由于每一个地址编号均对应一个内存单元,因此可以形象地说一个地址编号就指向一个内存单元。C 语言中把地址形象地称作指针。
指针就是地址。而可以保存指针的变量被称为指针变量(*声明)。而&是取地址操作,读取了变量的地址。
(规则等基本知识略……)
特别需要注意的是,指针不能没有合法的指向,必须要对应一块指定的内存空间,随机指向的"野指针"可能会指向我们有用的内存,导致系统崩坏。十分危险。
而这也是cpp编程中常见的错误。
另外,指针的设置也会导致另一个问题,Memory Leak,即内存泄露:
1、内存分配未成功,却使用了它
2、内存分配虽然成功,但是尚未初始化就引用它
3、内存分配成功并且已经初始化,但操作越过了内存的边界
4、忘记了释放内存,造成内存泄露
三、智能指针:
为了避免上边我们所讨论的问题的出现,cpp中设计了一种被称为智能指针的指针。
在我们的所分配的动态内存过期之后,析构函数自己删除所指向的内存,这就是智能指针的原理。
在c++98和11中,分别提供了auto_ptr和unique_ptr,shared_ptr以及weak_ptr。
其中,auto是98的,已经被unique所取代。
我们这里重点学习了后者unique和shared。
但是auto是基本的,也应该看一下。
分类
std::unique_ptr<T>
:独占资源所有权的指针。std::shared_ptr<T>
:共享资源所有权的指针。std::weak_ptr<T>
:共享资源的观察者,需要和 std::shared_ptr 一起使用,不影响资源的生命周期。
unique
所谓的独占资源所有权,就是独占资源时,可以利用此指针进行管理。
当离开此对象的作用域时,会自动释放资源。
使用时比较简单。
不需要delete。