shared_ptr
概念
shared_ptr 是 C++11 中引入的一种智能指针,用于自动管理资源,特别是动态分配的内存。它属于
具有较好的安全性,可以避免内存泄漏和悬挂指针问题。
特性
线程安全的说明
shared_ptr 自身的引用计数是线程安全的,但指向的对象本身不是线程安全的。如果多个线程需要访问同一对象,需要额外的同步机制。
二进制兼容性
如果客户代码里有 new Bar,那么肯定不安全,因为 new 的字节数不够装下新 Bar。相反,如果 library 通过 factory 返回 Bar* (并通过 factory 来销毁对象)或者直接返回 shared_ptr
即把创建交给动态库,而不是由客户自己创建。
陈硕博客
一个有趣的问题
#include <iostream>
#include <memory>class base
{
public:base(){std::cout << "base constructor" << std::endl;}~base(){std::cout << "base destructor" << std::endl;}
};class test: public base
{
public:test(): base(){std::cout << "test constructor" << std::endl;}~test(){std::cout << "test destructor" << std::endl;}
};int main()
{std::cout << "test shared_ptr------------" << std::endl;{std::shared_ptr<base> ptr(new test);}std::cout << "test unique_ptr------------" << std::endl;{std::unique_ptr<base> ptr(new test);}return 0; // success
}
输出结果是:
test shared_ptr------------
base constructor
test constructor
test destructor
base destructor
test unique_ptr------------
base constructor
test constructor
base destructor
可以发现shared_ptr可以在析构时自动释放资源没有设置基类为虚析构函数的基类,而unique_ptr不行。
查阅源码调查原因发现:
shared_ptr中,会判断是否存在基类
并且创建一个指向基类的指针:
mutable __weak_ptr<_Tp, _Lp> _M_weak_this;
当析构的时候会一并调用_M_weak_this的析构函数,也就是基类的析构函数.
shared_ptr能实现这一点主要在于:
shard_ptr构造的时候,会去判断指针的类型,并结合shared_ptr的模板参数
unique_ptr之所以实现不了这种特性,是因为unique_ptr默认采用的是default_delete,而default_delete的模板参数是由unique_ptr的模板参数决定的。所以导致其不能实现。
但unique_ptr的优点就是可以灵活的更换delete函数。