Boost logo

Boost :

From: Yashin Evgeny (evgeny.yashin_at_[hidden])
Date: 2007-05-28 20:32:53


Boost: 1.34.0
Compiler: MSVC 8.0 (without SP1).

Here is, minimal example.

struct Conn : public boost::signals::trackable
{
    void operator()(){}
};

void f()
{
    boost::signal<void ()> sig;
    Conn c;
    sig.connect( c );

    c = Conn(); // crash inside..
}

The reason is simple. During clear() method of std::list, there are
signals::connection destructor calls are happening, which, in turn, calling
erase method of the same std::list, and as a result we're getting
_DEBUG_ERROR("list erase iterator outside range");

I guess, the bug is with "dying" variable: in destructor, it was set to
true, and then signals::connection destructors are not trying to remove
themself from the std::list. But in boost::signals::trackable::operator=()
there is no dying flag marking.

Evgeny.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk