Hi, I'm working with boost::thread_specific_ptr in a Win32 environment and sometimes I get an access violation when my program exits. To reproduce the error I write the following sample program:
... #include <boost/thread/thread.hpp> #include <boost/thread/tss.hpp> #include <iostream> class Data { public: ~Data() { std::cout << reinterpret_cast<int>(this) << std::endl ; } } ; typedef boost::thread_specific_ptr<Data> ThrData ; void main() { ThrData data ; data.reset( new Data ) ; data.reset() ; } ... You can see how the Data destructor is called twice, one in the data.reset() execution and the second when the program exits. I was examining the boost source code and I think the problem is in the file libs\thread\src\tss.cpp ... bool tss::set(void* value) { if (value && m_cleanup) { cleanup_handlers* handlers = get_handlers(); assert(handlers); if (!handlers) return false; cleanup_info info(m_cleanup, value); (*handlers)[m_key] = info; } return !!TlsSetValue(m_key, value); } ... In this function when value is a NULL pointer the cleanup_info data is not actualized. So when the thread ends it will delete the data that was deleted previously with the boost::thread_specific_ptr::reset() method. I think the solution is ... bool tss::set(void* value) { if (m_cleanup) { .... This way a NULL pointer actualizes the cleanup_info data, but I don't know if there is any lateral effect when removing value from the 'if' sentence. Regards, Oscar. _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost