У меня есть этот код внутри конструктора класса (не написанный мной), и он записывает переменный список arg в файл tmp.var arg список tempfile, зачем он нужен?
Я задавался вопросом, зачем это нужно? Tmpfile удаляется после того, как этот ctor выходит из области видимости, а список var arg находится внутри вектора m_str.
Может ли кто-нибудь предложить лучший способ сделать это без использования tmpfile?
DString(const char *fmt, ...)
{
DLog::Instance()->Log("Inside DString with ellipses");
va_list varptr;
va_start(varptr, fmt);
FILE *f = tmpfile();
if (f != NULL)
{
int n = ::vfprintf(f, fmt, varptr) + 1;
m_str.resize(n + 1);
::vsprintf(&m_str[0], fmt, varptr);
va_end(varptr);
}
else
DLog::Instance()->Log("[ERROR TMPFILE:] Unable to create TmpFile for request!");
}
Можете ли вы изменить прототип конструктора, чтобы избежать использования эллипсов? – ereOn
ereOn: Без причины. Это привело бы к множеству ошибок в моей кодовой базе. –
Если 'm_str' - это' std :: string', то обработка '& m_str [0]' как указателя на массив дает неопределенное поведение; хранение не гарантируется, что оно будет смежным.Если это 'std :: vector', то это нормально. –