« OSのドライバを一括バックアップするソフト Double Driver | メイン | PORTA PROの交換用イヤーパッド購入 »

C++Builder2007とC++Builder2009の__finallyの動作を検証する

気になる記事を見つけたので、動作を検証しました。

catch、finallyブロックをreturnで抜ける時、それより外にあるfinallyブロックは実行されません。__finallyブロックであっても必ず実行されるわけではないので、注意が必要です。

__finallyブロックを必ず実行する

__finallyブロックが必ずしも実行されないコード1:

try {
  try {
    throw "error";
  } catch(...) {
    return 0;
  }
} __finally {
    std::puts("finally");
}

C++Builder2007、C++Builder2009ともに、__finallyブロックは実行されました。
期待通りの動作です。

__finallyブロックが必ずしも実行されないコード2:

try {
  try {
  } __finally {
    return 0;
  }
} __finally {
    std::puts("finally");
}

C++Builder2007では、__finallyブロックは実行されました。
期待通りの動作です。

C++Builder2009では、次のコンパイルエラーが発生しました。

[BCC32 エラー] File1.cpp(16): E2551 リターン文は _finally ブロックでは使用できない

C++Builder2009で仕様が変更されたのでしょうか。
C++ではRAIIが使えますから、__finallyはあまり使用されていないのかもしれません。

トラックバック

このエントリーのトラックバックURL:
http://www.gesource.jp/mt/mt-tb.cgi/878

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

About

2009年01月09日 18:56に投稿されたエントリーのページです。

ひとつ前の投稿は「OSのドライバを一括バックアップするソフト Double Driver」です。

次の投稿は「PORTA PROの交換用イヤーパッド購入」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35