配列版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日、コメントでの指摘に基づき、本文の一部を修正しました。
スポンサード リンク |
この記事のカテゴリ
- C++ ⇒ 配列版boost::shared_ptrの初期化
「最初にmake_sharedだけ取り上げなかった」は「最初にmake_sharedだけしか取り上げなかった」でしょうか?
ありがとうございます。そのとおりですので、本文を修正しました。