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 構築を期待
}