DDJのスコープガード(一般:例外安全コードの記述方法を変更する—永遠に)に関する記事を読みましたが、その一般的な使用法を理解しています。
ただし、一般的な使用法は、特定の操作のためにスタック上の特定のスタックガードをインスタンス化することです。
{
FILE* topSecret = fopen("cia.txt");
ON_BLOCK_EXIT(std::fclose, topSecret);
... use topSecret ...
} // topSecret automagically closed
しかし、実行時にクリーンアップ操作をスケジュールしたい場合、たとえばループがある場合はどうなりますか?
{
vector<FILE*> topSecretFiles;
for (int i=0; i<numberOfFiles; ++i)
{
char filename[256];
sprintf(filename, "cia%d.txt", i);
FILE* topSecret = fopen(filename);
topSecretFiles.push_back(topSecret);
ON_BLOCK_EXIT(std::fclose, topSecret); // no good
}
}
明らかに、forスコープtopSecret
とともに閉じられるため、上記の例は機能しません。実行時に必要であると判断したクリーンアップ操作を同じように簡単にキューに入れることができるスコープガードパターンが必要です。このようなものはありますか?
スコープガードオブジェクトを標準キューにプッシュできません。元のオブジェクト(プッシュしているオブジェクト)がプロセスで却下されるためです。ヒープに割り当てられたスタックガードをプッシュし、dtorのメンバーを削除するキューを使用するのはどうですか?誰かがもっと賢いアプローチを持っていますか?