智能指针可以自动释放不再使用的内存,能够有效的防止内存泄漏。智能指针是一个对象,普通指针是一个变量。智能指针是对普通指针的封装,其安全性要高于直接使用普通指针。 智能指针的分类
共享的智能指针shared_ptr
shared_ptr多个指针指向相同的对象。
每一个shared_ptr的拷贝都指向相同的内存。
shared_ptr使用引用计数,不再被引用时,自动删除所指向的堆内存。独占的智能指针unique_ptr
同一时刻只能有一个unique_ptr指向给定对象。
离开作用域时,若其指向对象,则将其所指对象销毁。弱引用的智能指针weak_ptr
weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权,但不能操作shared_ptr指向的内容。
使用weak_ptr的成员函数use_count()可以观测资源的引用计数。
weak_ptr可以使用成员函数lock()从被观测的shared_ptr获得一个可用的shared_ptr对象, 从而操作资源。
智能指针的应用场景
在不考虑程序运行效率的情况下,所有普通指针均可使用智能指针替代。 智能指针的相关问题
Q:shared_ptr的原理
A:shared_ptr维护了一个指向control block的指针对象,来记录引用个数。
Q:如何判断weak_ptr的对象是否失效?
A:
1、expired():检查被引用的对象是否已删除。
2、lock()会返回shared指针,判断该指针是否为空。
3、use_count()也可以得到shared引用的个数,但速度较慢。
Q:shared 和 unique区别
A:unique具有唯一性,对指向的对象值存在唯一的unique_ptr。unique_ptr不可赋值,但是move()可以转换对象的所有权。



