ダウンロード
最新バージョン
C++ | 1.2.1-RELESE |
Java | 1.2.1-RELESE |
Python | 1.2.1-RELESE |
Tools | 1.2.1 |
初めての方へ
Windows msi(インストーラ) パッケージ (サンプルの実行ができます。)
C++,Python,Java, Toolsを含む |
1.2.1-RELEASE |
RTコンポーネントを開発するためには開発環境のインストールが必要です。詳細はダウンロードページへ
Choreonoid
モーションエディタ/シミュレータ
OpenHRP3
動力学シミュレータ
OpenRTP
統合開発プラットフォーム
産総研RTC集
産総研が提供するRTC集
TORK
東京オープンソースロボティクス協会
DAQ-Middleware
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
構造体・/オブジェクトリファレンス
CORBA の構造体は C++ において、構造体 "struct" にマッピングされる。
構造体に可変長のメンバー (string、wstring、sequence (可変長メンバを持つ struct、可変長メンバを持つ union) が含まれていると、構造体は可変長データとみなされます。 この場合、固定長の構造体とは異なる C++ コードが生成され、戻り値や outパラメータにおける扱いが異なります。
_var 型
変換コンストラクタ(T_ptr)
_ptr型のオブジェクト参照の所有権は_var型に移るため、参照カウントの増減はない。
変換コンストラクタ(const T_var&)
代入元の_var型のオブジェクト参照の所有権はコピーされる。
変換コンストラクタ(const T_member)
in引数とin()関数
単純にオブジェクト参照の_ptr型ポインタを返す。 所有権の移動は起こらない。
通常、関数のin引数にオブジェクト参照を渡す際に使用する。 オブジェクト参照を与えられた側の関数は、所有権を持たないため関数内でreleaseしてはいけない。 関数から戻ってきたあと、_var型変数に依然として所有権が保持されており、_var型変数の解体時にオブジェクトはreleaseされる。
オブジェクト参照をin引数として受け取る関数を定義する場合は、_ptr型の引数として定義する。さらに、関数内では、そのオブジェクトのオペレーションを呼ぶだけで、release等は行ってはいけない。 また、関数内でオブジェクト参照をどこか(グローバル変数、static 変数、オブジェクトのメンバー等)に保存したい場合は、所有権をコピーするため duplicate関数で複製する必要がある。
out引数と out()関数
現在所有している参照をrelease(参照カウントをデクリメント)して、リファレンスのポインタをnilにセットして返す。 すなわち、out()関数呼び出し以前にもしオブジェクト参照を保持している場合はその所有権を放棄し参照は破棄される。
通常、関数のout引数にオブジェクト参照を渡す際に使用する。すなわち、関数から戻ってきたあと、この変数に新たにオブジェクト参照が保持されていることが期待される。 このとき、オブジェクト参照の所有権はこの変数に保持されていると考える。 out()で変数を渡された関数側では、何らかの形でオブジェクト参照を生成または複製して、引数に所有権を渡す必要がある。
オブジェクト参照をout引数として受け取る関数を定義する場合は、_ptr型参照の引数として定義する。関数内では、引数は必ずnilオブジェクト参照であり、かつ通常何らかのオブジェクトを所有権を与えて代入することが期待される。
inout()
リファレンスへのポインタの参照を返す。
通常、関数のinout引数にオブジェクト参照を渡す際に使用する。 すなわち、関数内では何らかのオブジェクト参照が引数に入っていることが期待され、オブジェクトの所有権は関数側に移る。また、関数は何らかのオブジェクト参照をこの引数に与えて返すことが期待され、引数すなわち呼び出し元の変数に所有権を与える。 関数内では引数にオブジェクト参照を新たにセットする場合は、まずreleaseしてから新たなオブジェクト参照を生成または複製して引数に所有権を渡す必要がある。
オブジェクト参照をinout引数として取る関数は、設計の観点からあまり推奨されない。もし、inout引数として取る関数を定義する必要がある場合は、_ptr型参照の引数として定義する。
_retn()
現在持っているオブジェクト参照の所有権を放棄してポインタを返す。
通常、関数の戻り値にオブジェクト参照を返す場合に使用される。 所有権は関数の呼び出し側に渡るので、呼び出し側ではオブジェクト参照を破棄する責任がある。したがって、呼び出し側で release するか、_var型変数で受ける必要がある。
逆に、戻り値でオブジェクト参照を返す場合、呼び出し側では必ず release により参照カウントがデクリメントされるため、関数内では_duplicate()などで所有権を複製しておく必要がある。
規則のまとめ
_var型,_ptr型の代入でのリファレンスカウント
_ptr型への_var型の代入
ポインタへの代入。
複製なし、解放せず。
_var型への_ptr型の代入
_var が保有しているオブジェクトに対して release() されるが、 引数で渡された _ptr型のオブジェクトに対しては duplicate() されない。
複製なし、解放あり。
_var型への_var型の代入
_var が保有しているオブジェクトに対して release() がコールされ、 かつ、引数で渡されたオブジェクトに対しても duplicate() がコールされる。
複製あり、解放あり。
_narrow()でのリファレンスカウント
_narrow()処理の過程において、_narrow()の呼び出しが成功した場合、その対象オブジェクトのリファレンスカウントはインクリメントされるが、失敗した場合はインクリメントされない。
デクリメントは行われない。
規則
クライアント側
クライアントが呼び出しからオブジェクト参照を受信するならば、そのクライアントはそのオブジェクト参照が不要となったときにはそれを開放しなくてはならない。
(引用: 『CORBA分散オブジェクト Orbixを用いて』 P.98 オブジェクト参照のためのメモリ管理)
サーバー側
呼び出し側に渡す参照の所有権は放棄される(つまり、その参照カウントは一つデクリメントされる。したがって、通常は、参照を返す前に適当な_duplicate()関数を呼び出すことになる)
(引用: 『CORBA分散オブジェクト Orbixを用いて』 P.98 オブジェクト参照のためのメモリ管理)
参考文献