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
>
|