配列版shared_ptrをnew[]で初期化する話です。make_shared で確保されたメモリ領域は,それを参照する weak_ptr が無くならない限り解放されない – 野良C++erの雑記帳を見て、maked_sharedを使わない例を紹介していないことを思い出したので、取り上げることにしました。ときには必要となることもあるかもしれません。

#include <iostream>
#include <boost/shared_ptr.hpp>
 
int main()
{
  boost::shared_ptr<int[]> p1(new int[4]);
  boost::shared_ptr<int[4]> p2(new int[4]);
 
  p1[3] = 101;
  std::cout << p1[3] << std::endl;
 
  p2[3] = 103;
  std::cout << p2[3] << std::endl;
}

boost::shared_ptrやboost::shared_arrayと同じですね。

もちろん、boost::shared_ptrなので削除子の指定もできます。

#include <iostream>
#include <cstdlib>
#include <boost/shared_ptr.hpp>
 
int main()
{
  boost::shared_ptr<int[]> p1(
    static_cast<int*>(std::malloc(sizeof (int) * 4)), std::free);
  boost::shared_ptr<int[4]> p2(
    static_cast<int*>(std::malloc(sizeof (int) * 4)), std::free);
 
  p1[3] = 201;
  std::cout << p1[3] << std::endl;
 
  p2[3] = 205;
  std::cout << p2[3] << std::endl;
}

なお、最初にmake_sharedだけしか取り上げなかった(配列版shared_ptrと非配列版shared_ptrとの変換)のは意図的なものでした。すなわち、(配列に限らず)基本的にはmake_sharedを使うべきという考えによるものです。


2013年4月12日、コメントでの指摘に基づき、本文の一部を修正しました。


スポンサード リンク

この記事のカテゴリ

  • ⇒ 配列版boost::shared_ptrの初期化