Effective C++——内存管理之make_shared

条款17 以独立语句将NEW置入智能指针

  1. 如果有一个函数int priority()
  2. void processWidget(shared_ptr< Widget> pw, int priority),由于shared_ptr的构造函数template< class T> template< class U> explict shared_ptr(*U t)是需要显示转换的,所以不能传入processWidget(new Widegt, priority() )!
  3. 为了解决上述问题,void processWidget(shared_ptr< Widget>(new Widget), priority() ),显示构造来解决,但是上述new Widget,构造控制块,priority(),是执行顺序不定的,可能priority()出现异常,导致Widegt未能正常析构。
  4. 为了解决3的内存泄漏,可以先shared_ptr< Widget> ptr (new Widget),再processWidget(ptr, priority())
  5. 或者通过make_shared< Widget>()来解决, auto ptr = make_shared< Widget>()
  6. make_shared< string>(10, ‘9’),调用代码如下:其核心是通过可变参数和完美转发,分析代码

template<typename _Tp, typename... _Args>
inline shared_ptr<_Tp>
make_shared(_Args&&... __args)
{
  typedef typename std::remove_const<_Tp>::type _Tp_nc;
  return std::allocate_shared<_Tp>(std::allocator<_Tp_nc>(),
				   std::forward<_Args>(__args)...);
}
 
template<typename _Tp, typename _Alloc, typename... _Args>
inline shared_ptr<_Tp>
allocate_shared(const _Alloc& __a, _Args&&... __args)
{
  return shared_ptr<_Tp>(_Sp_make_shared_tag(), __a,
			 std::forward<_Args>(__args)...);
}

分析如下:
a. _Args&&…为万能引用,配合std::forward< _Args>(__args)…),当传入一个右值比如1时,可以转发int&& 右值出去
b. 利用可变参数,当make_shared< string>(10, ‘9’)时候,实际shared_ptr< _Tp>(_Sp_make_shared_tag(), __a,
std::forward< int&&>(10) ,std::forward< char&&>©),

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值