株式会社エス・スリー・フォー

2.5メモリの割り当てと解放

オブジェクトがヒープ領域に割り当てられている場合、それを削除するのは誰の役割でしょうか? 他社のライブラリでは、誰がオブジェクトを所有しているかが問題になる場合があります。

ほとんどの Rogue Wave のクラスでは、非常に簡単な対策をとっており、ユーザがヒープ領域から何かを割り当てた場合は、それを解放するのは、そのユーザの責任になります。Rogue Wave ライブラリがヒープ領域から何かを割り当てた場合は、ライブラリが責任を持って解放します。

オブジェクトの作成に関しては、例外が 2 つあります。最初の例外は、演算子によるものです。

RWFile&      operator>>(RWFile& file, RWCollectable*&);
Rwvistream&  operator>>(RWvistream& vstream, RWCollectable*&);

これらの演算子は、それぞれ RWFile または RWvistream からの RWCollectable を継承しているオブジェクトを復元します。これらは、ヒープ領域から割り当てられたオブジェクトへのポインタを返します。これを解放するのは、ユーザの責任です。

2 番目の例外は、メンバ関数によるものです。

RWCollection* RWCollection::select(RWtestCollectable, void*)const;

この関数は、ある選択基準を満たすメンバとともに、ヒープ領域から割り当てられたコレクションへのポインタを返します。終了したら、このコレクションを削除するのもユーザの責任です。

また、オブジェクトの削除に関する例外もあります。多くのコレクションクラスでは、メソッド clearAndDestroy() を使うことができます。これは、コレクションからすべてのポインタを取り除き、それぞれ解放します。ただし、clearAndDestroy() を使用する場合は、そのコレクションのポインタすべてを削除しても問題が起きないかどうかを判断するのは、ユーザの責任となります。

これらのメソッドについて詳しくは、Tools.h++ Class Referenceを参照してください。