Я думаю, что вам лучше всего было бы предоставить фиксированный буфер, который, вероятно, будет обрабатывать подавляющее большинство случаев, а затем сделать специальную обработку для остальных. Нечто подобное (непроверенное, за исключением влажной посуды внутри моего черепа):
std::string GetTimeAsString (std::string formatString, time_t theTime) {
struct tm *timeinfo;
char buffer[100], *pBuff = buffer;
int rc, buffSize = 100;
timeinfo = localtime (&theTime);
rc = strftime(pBuff, 100, formatString.c_str(), timeinfo);
// Most times, we shouldn't enter this loop.
while (rc == 0) {
// Free previous in it was allocated.
if (pBuff != buffer)
delete[] pBuff;
// Try with larger buffer.
buffSize += 100;
pBuff = new char [buffSize];
rc = strftime(pBuff, buffSize, formatString.c_str(), timeinfo);
}
// Make string then free buffer if it was allocated.
std::string result(pBuff);
if (pBuff != buffer)
delete[] pBuff;
return result;
}
strftime
вернет ноль, если предоставленный буфер был недостаточно большим. В этом случае вы начинаете выделять большие буферы, пока они не подойдут.
Ваш нераспределенный размер буфера и приращение, которое вы используете для размера выделения, можно настроить в соответствии с вашими потребностями. Преимущество этого метода заключается в том, что вы не заметите снижение эффективности (каким бы небольшим оно ни было), за исключением редких случаев - для этого подавляющего большинства распределение не выполняется.
Кроме того, вы можете выбрать другой метод (например, + 10%, удвоение и т. Д.) Для увеличения размера буфера.