|
From: <Jak...@no...> - 2002-04-02 16:39:38
|
Hi,
I run log4cpp on VC6.0 SP5. Version 0.30 + Category and Appender
from CVS.
I have problem with Category::removeAllAppenders.
Version 1.34 (most current in CVS).
When I run testCategory (or my simple tests) I have
Unhandled exception Access Violation
with stack trace:
[ ....cut ...]
log4cpp::Category::removeAllAppenders() line 152 + 16 bytes
main(int 1, char * * 0x004417d0) line 144 + 13 bytes
mainCRTStartup() line 338 + 17 bytes
KERNEL32! 77f1ba06()
There is:
void Category::removeAllAppenders() {
threading::ScopedLock lock(_appenderSetMutex);
{
for (AppenderSet::iterator i =3D _appender.begin();
i !=3D _appender.end(); i++) {
// found
OwnsAppenderMap::iterator i2;
if (ownsAppender(*i, i2)) {
delete (*i);
}
=20
_ownsAppender.clear();
_appender.clear();
}
}
}
Problem is with delete of current iterator. Acording to specs and
good comment in Appender.cpp you can't use iterator after deleteing it
[
Appender::_deleteAllAppenders()=20
--- cut ---
i++; // increment iterator before delete or iterator will be =
invalid.
delete (app);
]
So I changed code to:
void Category::removeAllAppenders() {
threading::ScopedLock lock(_appenderSetMutex);
{
Appender* app;
AppenderSet::iterator i2;
for (AppenderSet::iterator i =3D _appender.begin();
i !=3D _appender.end(); ) {
// found
app =3D *i;
i2 =3D i;
i++;
OwnsAppenderMap::iterator i3;
if (ownsAppender(*i2, i3)) {
delete app;
}
}
=20
_ownsAppender.clear();
_appender.clear();
}
}
and it passes testCategory test.
cheers,
--jakub
|