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 |