前言
智能指针的认识与学习
为什么要使用智能指针
一句话带过:智能指针就是帮我们C++程序员管理动态分配的内存的,它会帮助我们自动释放new出来的内存,从而避免内存泄漏!
在c++中,智能指针一共定义了4种:
auto_ptr、unique_ptr、shared_ptr 和 weak_ptr。其中,auto_ptr 在 C++11已被摒弃,在C++17中已经移除不可用。
不带引用计数的智能指针auto_ptr,unique_ptr
1.auto_ptr智能指针不带引用计数,那么它处理浅拷贝的问题,是直接把前面的auto_ptr都置为nullptr,只让最后一个auto_ptr持有资源。
2.unique_ptr是将左值引用的拷贝构造函数和拷贝赋值运算符删除了,外部不能调用(等同于私有化),防止智能指针浅拷贝问题的发生;但unique_ptr提供了带右值引用的拷贝构造函数和拷贝赋值运算符,这样临时对象就可以使用了,非常有用;
带引用计数的智能指针 : shared_ptr和weak_ptr
带引用计数的智能指针:多个指针可以管理同一个资源:shapred_ptr,weak_ptr;
当允许多个智能指针指向同一个资源的时候,每一个智能指针都会给资源的引用计数加1,当一个智能指针析构时,同样会使资源的引用计数减1,这样最后一个智能指针把资源的引用计数从1减到0时,就说明该资源可以释放了,由最后一个智能指针的析构函数来处理资源的释放问题,这就是引用计数的概念。这样能够保证在最后一个指向资源的shapred_ptr离开作用域后保证释放资源,而多个shapred_ptr指向同一个资源时候,一个shapred_ptr的析构不会将释放资源,即不会影响其他shared_ptr;通常情况下资源默认删除是delete,也可以自定义删除器来处理如果释放资源;
要对资源的引用个数进行计数,那么大家知道,对于整数的++或者- -操作,它并不是线程安全的操作,因此shared_ptr和weak_ptr底层的引用计数已经通过CAS操作,保证了引用计数加减的原子特性,因此shared_ptr和weak_ptr本身就是线程安全的带引用计数的智能指针。
曾经有一道面试的问题这样问“shared_ptr智能指针的引用计数在哪里存放?
资源引用计数存放在堆内存上
总结
深刻理解智能指针