From: Bastiaan B. <bas...@li...> - 2002-04-02 21:24:31
|
Hi Jakub, This is a known bug (#527467) and a fix has been committed to CVS (HEAD branch). I intend to release 0.3.1 (containing the fix) later this week. Thanks, Bastiaan Bakker LifeLine Networks bv Jak...@no... wrote: >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 = _appender.begin(); > i != _appender.end(); i++) { > // found > OwnsAppenderMap::iterator i2; > if (ownsAppender(*i, i2)) { > delete (*i); > } > > _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() > --- 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 = _appender.begin(); > i != _appender.end(); ) { > // found > app = *i; > i2 = i; > i++; > > OwnsAppenderMap::iterator i3; > if (ownsAppender(*i2, i3)) { > delete app; > } > } > > _ownsAppender.clear(); > _appender.clear(); > } > } > >and it passes testCategory test. > >cheers, >--jakub > > > > > > >_______________________________________________ >Log4cpp-devel mailing list >Log...@li... >https://lists.sourceforge.net/lists/listinfo/log4cpp-devel > |