C++智能指针
概念:
所谓智能指针就是智能/自动化的管理指针所指向的动态资源的释放。它是一个类,有类似指针的功能,对*和->运算符进行了重载;
头文件:
除了auto_ptr 其他的编译时要加“-std=c++11”
常见的智能指针
auto_ptr
- 特点:只能有一个指针占用对象所有权;
- auto_ptr 原指针拷贝给其他指针后原指针失效;
- auto_ptr的析构函数用的时delete,而不是delete[],所以申请数组会造成内存泄漏;
- 在C++11标准中已经废弃auto_ptr
unique_ptr
- 特点:unique_ptr可以看成是auto_ptr的代替品。因为它对对象的所有权比较专一,所以叫unique;不允许拷贝和赋值操作;允许函数返回uniqur_ptr类型指针;支持对象数组;
- 不允许赋值但可以转让所有权move();
shared_ptr
- 特点:shared_ptr定义智能指针A拷贝构造产生智能指针B时,A和B公用一个对象;赋值时也一样;
- 实现原理:shared_ptr智能指针实现的时候,,它内部使用了引用计数的技术(A.use_count());
- 当普通指针p被两个shared_ptr指针同时指向,析构时会释放两次;
- 循环引用时会造成内存泄漏;
weak_ptr
- 特点:weak_ptr是为了配合shared_ptr而引入的一种智能指针来协助share_ptr工作;
- weak_ptr的含义为弱引用,他的构造和析构不会引起计数的增加或减少;
- 它可以从一个shared_ptr或另一个weak_ptr产生(赋值);
- 它没有重载*和->,所以不能通过它访问对象内部的成员;
- 可以使用它提供的lock()获得一个可用的shared_ptr对象;
- 帮助解决循环引用问题
实现原理总结
- 智能指针本质上不是指针而是一个类;
- 智能指针用一个类描述,这个类中有一个指针成员(一个引用计数成员);
- 智能指针在栈上创建;
- 构造函数中初始化指针成员指向对象(初始化引用计数成员的值为1);
- 析构函数中删除指针成员指向的对象(将引用计数的值自减,如果减到0的时候,删除指针成员指向的对象);
- 对* 和->运算符进行了重载;