De nombreux problèmes peuvent être résolus en se débarrassant des trucs poilus, comme la gestion manuelle de l'allocation. N'utilisez jamais new T[N]
dans votre code: utilisez plutôt std::vector<T> v(N);
. Il suffit de cela seul peut résoudre votre problème, parce que les choses pointeur n'est pas la manière:
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
}
beaucoup plus facile à lire et à maintenir. Notez encore mieux serait un std::string buf(n + 1);
, alors vous pouvez simplement faire ofstr << buf;
. Malheureusement, std::string
n'est actuellement pas nécessaire pour stocker ses éléments de manière contiguë, comme std::vector
. Cela signifie que la ligne avec &buf[0]
n'est pas garantie de fonctionner. Cela dit, je doute que vous trouverez une implémentation où cela ne fonctionnerait pas. Pourtant, il est sans doute préférable de maintenir un comportement garanti.
Je fais suspect le issue étiez-vous déréférencer le pointeur, cependant.
Je pense que nous aurions besoin de voir le code d'appel aussi, peut-être vous pouvez le réduire à un exemple compilable? Aussi, n'utilisez pas l'allocation manuelle comme ça. :) Changez votre substance 'buf' en' std :: vector buf (n + 1); 'et' :: vsprintf (& buf [0], fmt, varptr); 'et pour la sortie,' std :: copy (buf.begin(), buf.end(), std :: ostream_iterator (ofstr)) '. Et bien sûr, pas besoin de "supprimer []" plus. De plus, vous n'avez pas besoin d'appeler 'ofstr.close() ', le destructeur le fait de toute façon. –
GManNickG
avez-vous vérifié les autorisations sur le fichier journal? – CharlesB
@GMan: 'std :: string' ne correspondrait-il pas plus que nécessaire à' std :: vector '? –
ereOn