C++ では、一時ディレクトリに書き込む必要のある関数がいくつかあります。理想的には、(I/O オーバーヘッドを最小限に抑えるため) すべてが書き込まれる 1 つの一時ディレクトリのみが作成されます。プログラムが終了すると、そのディレクトリは自動的に削除されます。
ただし、実際にディレクトリを使用する関数のみがその作成と削除を担当する必要があると思うため、メイン関数で一時ディレクトリの作成と削除を処理したくありません。また、メイン関数は、一時ディレクトリが使用されていることを必ずしも認識していません。
これが私が試したことです(以下のコードを参照):どこからでもグローバルに呼び出すことができるgetTempDir()関数は、最初の呼び出しでのみディレクトリを作成し、すべての呼び出しでディレクトリ名を返します。最初の呼び出しでは、デストラクタがディレクトリを削除する小さな DirRemover オブジェクトへの静的な boost::shared_ptr も作成します。そのデストラクタは、プログラムの終了時に自動的に呼び出されます。
問題は、プログラムの終了に失敗した場合や kill などで FileRemover デストラクタを呼び出さないことです。より良い解決策はありますか?
コードは次のとおりです。
std::string getTempDir(){
static bool alreadyThere = false;
static std::string name = "";
if(!alreadyThere){
// create dir with
// popen("mktemp -p /tmp","r"))
// and store its name in 'name'
removeAtEnd(name);
alreadyThere = true;
}
return name;
}
void removeAtEnd(const std::string& name){
static boost::shared_ptr<DirRemover> remover(new DirRemover(name));
}
struct DirRemover {
std::string name;
DirRemover(const std::string& n) : name(n){}
~DirRemover(){
// remove 'name' dir with popen("rm -r ...")
}
};