一、shared_ptr、weak_ptr、uinique_ptr(浅谈)
1、shared_ptr
共享指针,持有计数块和数据块;
当使用裸指针初始化shared_ptr时,系统会给shared_ptr申请两块内存,一块数据块,一块计数块,这样的情况下就存在内存泄漏的风险,如果先申请两个数据块,然后初始化两个share_ptr在数据块内存申请完成后或计数块初始化失败,则share_ptr初始化失败,数据块的内存就没有被管理起来,释放就成了一个问题;
以下为截取的shared_ptr构造函数源码及make_shared函数源码的比较:
/*举例*/
auto s1 = new std::string("213");
auto s2 = new std::string("213");
std::shared_ptr<std::string> p1(s1);
std::shared_ptr<std::string> p1(s2);
std::shared_ptr<std::string> p1(new std::string("213"));
/*share_ptr的裸指针够造版本*/
template<class _Ux,
enable_if_t<conjunction_v<conditional_t<is_array_v<_Ty>, _Can_array_delete<_Ux>, _Can_scalar_delete<_Ux>>,
_SP_convertible<_Ux, _Ty>>, int> = 0>
explicit shared_ptr(_Ux * _Px)
{
// construct shared_ptr object that owns _Px
_Setp(_Px, is_array<_Ty>{
});
}
/*构造调用共享初始化*/
template<class _Ux>
void _Setp(_Ux * _Px, false_ty