配列をヒープ領域上に動的に割り当てる例 ======================================== 2つ目の例では配列データは動的に割り当てます。 そのためdata1,data2の配列の定義はなくなっています。 その代わりにmain関数の中で配列を動的に割り当てています。 一つ目の例と全く同じ関数 ``set_dummy_data``, ``copy_data``, ``print_data`` が登 場します。 main関数を見てみます。 .. literalinclude:: s002.cpp :language: c++ :linenos: :lineno-start: 36 :lines: 36-49 doubleへのポインタ型の変数 ``parray1``, ``parray2`` を用意しています。 そして、 ``try { ... } catch { ... }`` 構文の中で値を設定しています。 try 節の処理の途中のどこか、関数呼び出しをしている先であっても、そのどこかで throw文が実行されると、処理がそこで中断されて、catch節に飛び込みます。この例で は、メモリ割り当ての new 演算子の中にthrow文が入っています。メモリ不足によりnew が失敗した場合に、throw文で処理を中断するのです。 throw文では、catch節にデータを渡すことができます。失敗の種類や原因を伝えるために 使われます。そのデータのことを例外(exception)と呼びます。この例だと ``std::bad_alloc`` 型の例外が throw されます。 メモリが獲得できた場合には、catchには行かずにそのまま処理が進みます。 double型の 配列領域を new 演算子で獲得して ``parray1``, ``parray2`` に記録します。 失敗した場合、 ``main`` 関数から return することでプログラムを終了させています。 プログラムでやろうとしていたことに成功して終了する場合(正常終了)の場合には ``main`` の戻り値は ``EXIT_SUCCESS`` とします。異常終了の場合にはここでやっているように ``EXIT_FAILURE`` とします。 .. literalinclude:: s002.cpp :language: c++ :linenos: :lineno-start: 50 :lines: 50-72 ``main`` 関数の残りでは、例1の時と同じ関数に対して、配列変数の代わりにdoubleのポ インタ変数を渡しています。 全体のソースを以下に示します: .. literalinclude:: s002.cpp :language: c++ :linenos: :download:`Download the source code` 実行例を示します :: % ./s002 s002 Before initialization [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] After initialization [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9] After array copy [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]