2017-01-18 6 views
4

this回答T.C.状態など未知のサイズのmake_sharedとは何ですか?

boost::make_sharedサポートアレイタイプ - 不明 サイズの1、または固定サイズの1

boost::shared_ptr<int[]> sh_arr2 = boost::make_shared<int[]>(30); 
boost::shared_ptr<int[30]> sh_arr3 = boost::make_shared<int[30]>(); 

まずどちらか、どのように未知のサイズの配列型をサポートmake_sharedことができますか?私は、配列のサイズが必要と思います。

第2に、sh_arr2とsh_arr3の違いは何ですか?どちらもintサイズの配列を作成しているようです。

答えて

2

例はそれほど大きくありません。 arr2_sizeが動的にそれは「不明」とみなすことができる定義することができますので

int arr2_size = 30; 
boost::shared_ptr<int[]> sh_arr2 = boost::make_shared<int[]>(arr2_size); 

:不明サイズの配列によって、彼らはおそらくそれは次のように呼び出すことができますを意味します。

第2に、両方ともサイズ30の配列を作成しますが、sh_arr3には、型自体のサイズが含まれており、アクセスが境界外に出た場合にコンパイラが警告を出すことができます。明示的なサイズのない型は、それらのケースを検出することができません。

1

まず、make_sharedは未知のサイズの配列タイプをどのようにサポートできますか?私は は、配列のサイズが必要と思うでしょう。

Boostは、ヘルパークラスを使用して、shared_ptr::operator[](...)の戻り値の型を判定します。また、ここでは、(TT[]に分解することができる場合)の境界を決定するために配列型のための専門を提供する別のヘルパークラスboost::detail::sp_extentを使用していますhttp://www.boost.org/doc/libs/1_63_0/boost/smart_ptr/shared_ptr.hppから要約抜粋です:

namespace boost{ 
template<typename T> 
class shared_ptr{ 
    ..... 
    typename boost::detail::sp_array_access<T>::type operator[] (std::ptrdiff_t i) const 
     { 
      BOOST_ASSERT(px != 0); 
      BOOST_ASSERT(i >= 0 && (i < boost::detail::sp_extent<T>::value || boost::detail::sp_extent<T>::value == 0)); 

      return static_cast< typename boost::detail::sp_array_access<T>::type >(px[ i ]); 
     } 
    .... 
} 

namespace detail{ 

    template< class T > struct sp_array_access 
    { typedef void type; }; 

    template< class T > struct sp_array_access<T[]> 
    { typedef T & type; }; 

    template< class T, std::size_t N > struct sp_array_access<T[N]> 
    { typedef T & type; }; 



    template< class T > struct sp_extent 
    { enum _vt { value = 0 }; }; 

    template< class T, std::size_t N > struct sp_extent<T[N]> 
    { enum _vt { value = N }; }; 
}//end namepace detail 
}//end namespace boost 

第二に、何がありますsh_arr2とsh_arr3の違いは?両方とも、 のように見え、intサイズの配列を作成しています。

2番目には範囲チェックがあります。 Boost docsから:

ブーストリリース1.53以降では、shared_ptrのは、動的に割り当てられた配列へ ポインタを保持するために使用することができます。これは、アレイタイプ(T []またはT [N])をテンプレートパラメータとして使用して によって達成されます。サイズが指定されていない配列T []とサイズ の配列T [N]を使用した場合の差はほとんどありません。 です。後者はoperator []が範囲 のインデックスをチェックすることを可能にするだけです。

関連する問題