条款13:以对象管理资源
在一个对象被开辟出来之后,需要占据一定的内存空间,如果空间是new出来的,就需要在合适的地方delete掉这款空间。如果调用delete析枸的是对象本身的话,一旦某些地方出现异常的话,或者是提前return导致来不及释放空间,就会导致内存泄露。
有两个思路解决这些问题
- 获得资源之后立即放进管理对象当中。使用auto_ptr管理对象,将对象作为初始化的参数放进去。
- 管理对象运用析构函数确保资源被正确释放,这个对象本来就是为了管理对象的创建和析构。
这里声明一点:auto_ptr只允许只想一个变量,如果改成指向另一个变量的话就会导致原来的先被析构。所以可以使用share_ptr以计数的方式来管理。计数为0代表没有使用就会被析构。
条款14:在资源类里面小心copying行为
禁止复制RaII类型变量,因为该种变量本来就是为了管理资源而创建的不应该被复制。
对底层资源管理使用“引用记数法”,并且针对不同的变量可以使用各自的删除器,在初始化的时候需要给删除器。删除器就是想要调用的析构函数。
条款15:在资源管理类里面提供对原始资料的访问
share_ptr使用*或者->运算符来进行访问,重载了这两个运算符。也可以使用get函数。
有的时候重载()运算符使用户使用的时候更加方便,但是有的时候只是想单纯的赋值而不是想要执行什么运算可能就会导致问题。
条款16:成对使用new与delete采用相同形式
当你使用new去开辟一段内存的时候,一个变量一个数组开辟方式是不同的。数组通常还包含一个存储数组大小的记录,方便知道到时候调用几次析构函数。
如果对一个数组不调用delete [] array 可能就会造成调用析构函数不全的现象,有一些内存没有被清除。
但是对于一个普通的变量这样调用的话也会导致问题,可能不断的清除一些根本没有的内存空间。
条款17:以独立语句将new加入智能指针里面
c++调用new指令以及调用share_ptr构造函数的顺序是不确定的,由此如果在此时将它放入函数里面就会导致问题。最好是分两步做。
先对share_ptr变量初始化,之后再放入函数中传参。