ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(CORBAサービス編)
Interstage

4.6.12 any型、sequence型のリリースフラグ

可変長データは、データをクライアントへ返却後、スケルトン中で自動的に解放します。
そのため、解放したくないデータは、そのデータをどこか別の領域に複写しておく必要があります。文字列(string)を例に説明します。



しかし、any、sequenceのような複雑な型の場合は、コピーする処理が複雑なため、リリースフラグを設定し、解放する/しないを設定できるようになっています。
リリースフラグの設定方法について以下に示します。

変数型

設定方法

any

コンストラクタ/replaceメソッドを使用ます。デフォルトは、CORBA_FALSEです。(注)

例)
CORBA::Any_ptr p = new CORBA::Any(_typecode, value, CORBA_TRUE);
CORBA::Any_ptr  p = new CORBA::Any;
p->replace( _typecode, value, CORBA_TRUE );

sequence

コンストラクタを使用します。デフォルトは、CORBA_FALSEです。(注)

例)
struct sample {
    string  para1;
    long    para2;
};
typedef sequence<sample> data;
->
sample_var *p = sample::allocbuf(2);
data *q = new data( 2, 2, p, CORBA_TRUE );
(2,2はそれぞれmaximum, length)

) CORBA_TRUEの場合は、解放されます。CORBA_FALSEの場合は、解放されません。


注意


any型が基本データ型(CORBA::Octet、CORBA::Char、CORBA::Longなど)のデータ領域を保持している場合は、リリースフラグの設定にかかわらず、データ領域を解放しません。以下の例のように、データ領域が必要なくなった時点で、明示的に開放してください。

CORBA::Long   *ptr = new CORBA::Long[10]; // データ領域の獲得
for( int i = 0;  i < 10; i++ ) 
    ptr[i] = i;                           // 値の設定

CORBA::Any    *p = new CORBA::Any(_tc_long, ptr, CORBA_FALSE); 
                                          // リリースフラグをCORBA_FALSEに設定

// 領域の解放
delete  p;                                // any型の解放
delete  ptr;                              // データ領域の解放