提示:此为个人梳理的智能指针的相关知识,如有问题欢迎指正。
一、智能指针定义及作用
智能指针是C++11新特性,智能指针主要用来管理在堆上分配的内存,它将普通的指针封装为一个栈对象,当栈对象生存周期结束后,会在析构函数中释放申请的内存,防止内存泄露。
C++11引入智能指针,方便管理堆内存。普通指针需要手动申请和释放内存,使用智能指针不需要关心对象内存申请和释放,可有效避免堆内存泄漏问题(忘记释放)。
二、智能指针类型
智能指针包括三种: shared_ptr、unique_ptr、weak_ptr
1.shared_ptr
shared_ptr是使用最多的一种。
多个智能指针可以指向同一个对象,即实现了资源的多指针共享。
shared_ptr引入了计数机制,可以通过use_count成员函数查看资源所有者的个数。当一个shared_ptr指向该对象,则计数加一,当一个shared_ptr释放,计数减一。当最后一个指针释放,就释放内存。
2.unique_ptr
unique_ptr,“针如其名”,是为一对一独占式。同一时间只能有一个智能指针可以指向该对象。试图复制unique_ptr会报错。当unique_ptr已经指向一个对象的时候,重新让它指向新的对象,则之前对象会被释放。
3.weak_ptr
弱指针主要是为了避免shared_ptr循环引用问题:当两个对象相互使用一个shared_ptr成员变量指向对方,会造成循环引用,使引用计数失效,从而导致内存泄漏。它是对对象的一种弱引用,不会增加对象的引用计数,和shared_ptr之间可以相互转化,shared_ptr可以直接赋值给它,它可以通过调用lock函数来获得shared_ptr。
当出现循环引用时,把其中一个shared_ptr转化成weak_ptr即可解决问题。
总结
智能指针可以帮助内存管理,可有效避免堆内存泄漏问题。