智能指针是对裸指针进行了包装,能够自动释放所指向的对象
C++智能指针主要有四种auto_ptr, unique_ptr, shared_ptr, weak_ptr;
auto_ptr是C++98,目前不建议使用,已经被unique_ptr取代, 剩余三种都是C++11。unique_ptr是独占式智能指针,不能复制和赋值。shared_ptr是共享式智能指针,用引用计数的方法管理指针。weak_ptr是用来辅助shared_ptr的
unique_ptr
独占式智能指针,同一时刻只能一个unique_ptr指向一个对象//声明int指针,默认初始化 unique_ptr<int> p1(new int); //声明int指针,指向对象初始化为10 unique_ptr<int> p2(new int(10)); //声明int数组,数组大小为32 unique_ptr<int[]> p3(new int[32]); //不能复制和赋值,但是可以移动 unique_ptr<int> p11 = std::move(p1); //p1就空了 //错误示范 unique_ptr<int> p22(p2); //不可以!!!!不能复制 unique_ptr<int> p22 = p2; //不可以!!!不能复制 //成员函数 //.release()释放,返回裸指针 int *p = p2.release(); delete p; //reset()成员函数,不带参数,把unique_ptr置空,带参数,重置 unique_ptr<int> p4(new int(0)); unique_ptr<int> p5(new int(0)); p4.reset(); //或者 p5.reset(new int(1));
- shared_ptr
共享式智能指针,多个shared_ptr可以指向同一个对象//初始化方法 shared_ptr<int> p1(new int); shared_ptr<int> p2(new int(0)); shared_ptr<int> p3 = std::make_shared<int>(0); //数组指针 shared_ptr<int[]> p4(new int[32]); //成员函数 //.unique() 是不是独占,只有一个shared_ptr指向这个对象 //.reset() 不带参数,引用计数减1,如果减为0了,释放对象 //带参数,引用计数减1,并指向新的对象 //.get() 获得裸指针