上一篇文章 C++:智能指针(1)——auto_ptr, unique_ptr的区别已经介绍了auto_ptr与unique_ptr;如果有疑惑的同学可以查看;
shared_ptr
shared_ptr是原始指针的封装类。它是一个附加了引用计数所有权模型,即它与shared_ptr的所有副本协作维护其包含的指针的引用计数。因此,每当一个新的指针指向资源时,计数器就会增加,而在调用对象的析构函数时,计数器就会减少。
引用计数一种用于存储对资源(例如对象,内存块,磁盘空间或其他资源)的引用,指针或句柄数量的技术。 在引用计数大于零之前,即直到删除了shared_ptr的所有副本之前,原始指针指向的堆内存不会被释放。 因此,当我们要将一个原始指针分配给多个所有者时,应该使用shared_ptr。
源码
template<class _Tp>
class _LIBCPP_TEMPLATE_VIS shared_ptr
{
public:
typedef _Tp element_type;
#if _LIBCPP_STD_VER > 14
typedef weak_ptr<_Tp> weak_type;
#endif
private:
element_type* __ptr_;
__shared_weak_count* __cntrl_;
...
}
析构函数调用栈
template<class _Tp>
shared_ptr<_Tp>::~shared_ptr()
{
if (__cntrl_)
__cntrl_->__release_shared();
}
void __release_shared() _NOEXCEPT {
if (__shared_count::__release_shared())
__release_weak();
}
bool __release_shared() _NOEXCEPT {
if (