5.8.2 コンストラクタとデストラクタの使用

C++のコンストラクタは、クラス・オブジェクトを作成するときに呼び出されて、クラス・オブジェクトを初期化します。デストラクタは、クラス・オブジェクトを破棄するときに呼び出されます。コンストラクタとデストラクタを持つ自動(ローカルで非静的な)変数では、変数がスコープに入るときにコンストラクタが呼び出され、変数がスコープから出るときにデストラクタが呼び出されます。ただし、tpreturn()またはtpforward()関数が呼び出されると、longjmp(3)を使用して、非ローカルのgotoがコンパイラによって実行され、自動変数のデストラクタは呼び出されません。この問題を防ぐには、tpreturn()tpforward()の呼出しが、サービス・ルーチンから呼び出される関数からではなく、サービス・ルーチンから直接行われるようにアプリケーションをコーディングします。また、次のいずれかの条件を満たす必要があります。

  • サービス・ルーチンがデストラクタ付きの自動変数を持たないようにします。自動変数は、サービス・ルーチンによって呼び出される関数内で宣言して使用します。
  • 自動変数は、tpreturn()またはtpforward()関数を呼び出す前にスコープが終了するように、ネストされた({}で囲まれた)スコープ内で宣言して使用します。

つまり、tpreturn()またはtpforward()関数を呼び出すときに、現在の関数のスコープ内またはスタック上にデストラクタを持つ自動変数が存在しないように、アプリケーションを定義します。

コンストラクタとデストラクタを持つグローバル変数および静的変数を正しく処理するために、多くのC++コンパイラではmain()のコンパイルにC++コンパイラを使用する必要があります。

ノート:

main()ルーチンには、プログラム開始時にコンストラクタ、プログラム終了時にデストラクタを確実に実行するための特別な処理が定義されています。

main()はOracle Tuxedoシステムで提供される関数なので、直接コンパイルされることはありません。ファイルがC++を使用してコンパイルされるには、buildserverコマンドでC++コンパイラを使用する必要があります。デフォルトでは、buildserverコマンドはUNIXのccコマンドを呼び出します。buildserverコマンドからC++コンパイラが呼び出されるようにするには、CC環境変数にC++コンパイラのフルパス名を設定します。また、C++のコマンド行で指定するオプションにフラグを設定するには、CFLAGS環境変数を設定します。詳細は、「環境変数の設定」を参照してください。