什么是智能指针
由于程序员在写代码时容易忘记将申请的空间进行释放,或者一些复杂情况下无法正确释放空间,那么就会导致程序奔溃,故需要设计智能指针来帮助我们进行资源的管理。
由于类创建对象会自动调用构造函数,类对象的销毁会调用析构函数,那么借助这个特点,我们创建一个类,在对象创建时获取资源,在对象销毁时释放资源,让资源的获取和销毁都由类来管理,也就是用对象的生命周期来控制资源。
这样的做法有两个好处:
1.不需要显式的释放资源
2.保证资源在整个对象的生命周期内都是有效的
而智能指针具有RAII的特性,智能指针这个类对象在创建时会获取资源,在对象销毁时会释放资源,并且智能指针具有指针的功能,解引用,->,那么在智能指针内部是对解引用和->运算符进行了重载。
auto_ptr
c++98中提供了auto_ptr,其解决浅拷贝的问题是用转移资源管理权限的方式
即当进行拷贝构造时,将当前指针设为NULL,将新的指针指向管理的资源
namespace bit {
template<class T>
class auto_ptr {
public:
auto_ptr(T* ptr)
: _ptr(ptr)
{
}
auto_ptr(auto_ptr<T>& sp)
: _ptr(sp._ptr) {
// 管理权转移
sp._ptr = nullptr;
}
auto_ptr<T>& operator=(auto_ptr<T>& ap) {
// 检测是否为自己给自己赋值
if (this != &ap) {
// 释放当前对象中资源
if (_ptr)
delete _ptr;
// 转移ap中资源到当前对象中
_ptr = ap._ptr;
ap._ptr = NULL;
}
return *this;
}
~auto_ptr() {
if (_ptr) {
cout << "delete:" << _ptr << endl;
delete _ptr;
}
}
// 像指针一样使用
T& operator*() {