|
明示的なブロック化
C++では、関数内にブロックを作り、ブロック内にローカル変数をとることができます。この変数はブロック内でのみ有効になります。次の例題を見てみましょう。
この関数は、一時的なスクリプトファイルを作り、実行する関数です。
#define SH_PATH "/home/user/bin/cpy.sh"
void MyApp::Copy()
{
int err = 0;
// 明示的なブロック化
{
ofstream ostr(SH_PATH);
if (!ostr) err = 1;
if (!err)
{
ostr << "#!/bin/bash\n";
ostr << "\n";
ostr << "cp -p /home/user/old/* /home/user/new/*\n";
ostr << "rm -f " << SH_PATH << endl;
}
}
if (!err)
{
chmod(SH_PATH, ACCESSPERMS);
system(SH_PATH);
}
return;
}
|
ここで、ofstream型の変数ostrは、明示的なブロック内にとっています。これは、スクリプトを実行する前に、ostrのデストラクタを呼び出すためです。ブロック内にとった変数のスコープはブロック内のみです。ブロックを抜けた段階でデストラクタが呼ばれます。
fstream系のクラスは、デストラクタでファイルクローズされるので、こうしておくとファイルをクローズしてから安全にスクリプトを実行できるというわけです。
このように、明示的なブロック化をすると、デストラクタが実行されるタイミングを制御することができます。
|