Win32 の GetTempPath 結果を std::string で返すには…
レビューをお願いされたプログラム中に、以下のようなコードがあって、いろいろ気になった次第。
typedef std::basic_string<TCHAR> tstring; const tstring get_temppath() { tstring result; int length = ::GetTempPath(0, NULL); TCHAR *buffer = new TCHAR[length + 1]; length = ::GetTempPath(length + 1, buffer) result = buffer; return result; }
std::bad_alloc の捕捉は気にしないとして、正しく取れるまでがんばるコードはこんな感じになるのかな。
const tstring get_temppath() { std::vector<TCHAR> buffer(MAX_PATH, '\0'); DWORD length; while (((length = ::GetTempPath(buffer.size(), &buffer.at(0))) + 1) >= buffer.size()) buffer.resize(length, '\0'); if (0 == length) throw std::runtime_error("failed: GetTempPath"); return &buffer.at(0); // 暗黙の tstring 構築を期待 }