C++中的智能指针(Smart Pointer)
1、介绍2、智能指针的简单自实现3、shared_ptr
3.1 shared_ptr的原理3、2 实例3.3 shared_ptr的循环引用 4、weak_ptr
4.1 weak_ptr解决循环引用 5、unique_ptr C++中的智能指针(Smart Pointer) 1、介绍
传统指针存在的问题:
需要手动管理内存;容易发生内存泄露(忘记释放、出现异常等);释放之后产生野指针。
智能指针就是为了解决传统指针存在的问题:
auto_ptr:属于C++98标准,在C++11中已经不推荐使用(有缺陷,比如不能用于数组);shared_pt:属于C++11标准;unique_prt:属于C++11标准。 2、智能指针的简单自实现
template
shared_ptr的设计理念:
多个shared_ptr可以指向同一个对象,当最后一个shared_ptr在作用域范围内结束时,对象才会被自动释放。
可以通过一个已存在的智能指针初始化一个新的智能指针:
shared_ptr 针对数组的用法: shared_ptr shared_ptr 一个shared_ptr会对一个对象产生强引用(strong reference); 每个对象都有个与之对应的强引用计数,记录着当前对象被多少个shared_ptr强引用着; 可以通过shared_ptr的use_count函数获得强引用计数; 当有一个新的shared_ptr指向对象时,对象的强引用计数就会+1; 当有一个shared_ptr销毁时(比如作用域结束),对象的强引用计数就会-1; 当一个对象的强引用计数为0时(没有任何shared_ptr指向对象时),对象就会自动销毁(析构)。 Person *p = new Person(); // Person(){ shared_ptr weak_ptr会对一个对象产生弱引用;weak_ptr可以指向对象解决shared_ptr的循环引用问题。 class Car {public: weak_ptr unique_ptr也会对一个对象产生强引用,它可以确保同一时间只有1个指针指向对象;当``unique_ptr`销毁时(作用域结束时),其指向的对象也就自动销毁了;可以使用std::move函数转移unique_ptr的所有权; // ptr1强引用着Person对象unique_ptr