
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.
participants (1)
-
Yashin Evgeny