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&&>©),

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章