Многие проблемы можно решить, избавившись от волосатых вещей, таких как ручное управление распределением.
Никогда не используйте new T[N]
в своем коде: вместо этого используйте std::vector<T> v(N);
. Просто это само по себе может решить вашу проблему, потому что указатель не мешает:
void DLog::Log(const char *fmt, ...)
{
va_list varptr;
va_start(varptr, fmt);
int n = ::_vscprintf(fmt, varptr);
std::vector<char> buf(n + 1);
::vsprintf(&buf[0], fmt, varptr);
va_end(varptr);
if (!m_filename.empty())
{
std::ofstream ofstr(m_filename.c_str(), ios::out);
if (!ofstr)
{
// didn't open, do some error reporting here
}
// copy each character to the stream
std::copy(buf.begin(), buf.end(), std::ostream_iterator<char>(ofstr));
// no need to close, it's done automatically
}
// no need to remember to delete
}
Гораздо проще читать и поддерживать. Обратите внимание, что даже лучше было бы std::string buf(n + 1);
, тогда вы могли бы просто сделать ofstr << buf;
. К сожалению, std::string
в настоящее время не требуется для непрерывного хранения своих элементов, например std::vector
. Это означает, что строка с &buf[0]
не гарантированно работает. Тем не менее, я сомневаюсь, что вы найдете реализацию, где она не будет работать. Тем не менее, возможно, лучше поддерживать гарантированное поведение.
Я подозреваю проблема если вы разыменовали указатель, хотя.