c++11智能指针
总体原则
- std::auto_ptr //不要使用
- std::unique_ptr //当需要独占资源所有权(访问权+生命周期控制权)的指针,且不给其他人用时
- std::shared_ptr //当需要共享资源所有权(访问权+生命周期控制权)的指针,其他人可用
- std::weak_ptr //只需要访问权而不需要生命周期控制权时。不能用来直接定义指向原始指针的对象,只能配合std::shared_ptr使用,不能将weak_ptr对象直接赋值给shared_ptr类型的变量。
通常使用可以一个std::shared_ptr配合n个std::weak_ptr使用,这样利于资源回收
概念介绍
-
独占 资源 和共享资源区别 ,直接上例子,请看下面
std::unique_ptr monster1(new Monster());//monster1 的对象我独占了,其他人不要用
std::unique_ptr monster2 = monster1;//错误,编译期出错,这是独占指针
std::unique_ptr monster3 = std::move(monster1);//正确,独占资源可以转移所有权给monster3.
monster1->doSomething();//错误(运行时奔溃):因为monster1的对象已经转移给monster3独占了,自己则指向了nullptr,所以运行时崩溃了std::shared_ptr monster1(new Monster()); //计数加到1
do{
std::shared_ptr monster2 = monster1; //计数加到2
}while(0); //该栈退出后,计数减为1,monster1指向的堆对象仍存在
std::shared_ptr monster3 = monster1; //计数加到2
3. 生命周期 就是指对象的创建和释放 的生存时间