$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Ashok Thirumurthi (athirumurthi.news_at_[hidden])
Date: 2005-10-28 19:36:47
Dear Boost,
The following call stack leads to an access violation when I link a VC 7.1 DLL to the release build of the boost signals 1_33_0 DLL.  In comparison, there is no access violation when I link to the debug build of the same library.  Similarly, when I add the signals source to my own release DLL, there is no access violation.  I attempted to disable all compiler optimizations in msvc.jam as follows.  However, after running bjam -a in signals\build and installing the output, the AV still occurs.  
    # 8.0 deprecates some of the options
    if ! [ MATCH ^([67].*) : $(version) ] 
    {
        # flags msvc.compile CFLAGS $(condition)/<optimization>speed : /O2 ;
        # flags msvc.compile CFLAGS $(condition)/<optimization>space : /O1 ;
        flags msvc.link.dll MANIFEST : "mt -manifest " ;
        flags msvc.link.dll OUTPUTRESOURCE : "-outputresource:" ;
    }
    else
    {        
        # flags msvc.compile CFLAGS $(condition)/<optimization>speed : /Ogity /O2 /Gs ;
        # flags msvc.compile CFLAGS $(condition)/<optimization>space : /Ogisy /O1 /Gs ;        
    }        
Note that I have a default installation of Visual Studio 2003.  How can I alter the release build to avoid the access violation?  More information:
Access violation reading location 0x00000004
(*((k2).content)).__vfptr is 0x00000000 
 bool operator()(const any& k1, const any& k2) const
  {
    if (k1.type() == typeid(front_type))
      return !(k2.type() == typeid(front_type));
    if (k1.type() == typeid(back_type))
      return false;
>   if (k2.type() == typeid(front_type))
      return false;
    if (k2.type() == typeid(back_type))
      return true;
> Colorado.dll!boost::signals::detail::any_bridge_compare<std::less<int>,int>::operator()(const boost::any & k1={...}, const boost::any & k2={...})  Line 54 + 0xc C++
  Colorado.dll!boost::detail::function::function_obj_invoker2<boost::signals::detail::any_bridge_compare<std::less<int>,int>,bool,boost::any,boost::any>::invoke(boost::detail::function::any_pointer function_obj_ptr={...}, boost::any a0={...}, boost::any a1={...})  Line 119 + 0x1b C++
  boost_signals-vc71-mt-1_33.dll!010a2340()  
  boost_signals-vc71-mt-1_33.dll!010a2c6a()  
  boost_signals-vc71-mt-1_33.dll!010a42be()  
  boost_signals-vc71-mt-1_33.dll!010a4bd0()  
  boost_signals-vc71-mt-1_33.dll!010a4dfc()  
  boost_signals-vc71-mt-1_33.dll!010a5933()  
  Colorado.dll!boost::signal0<bool,boost::last_value<bool>,int,std::less<int>,boost::function<bool __stdcall(void),std::allocator<void> > >::signal0<bool,boost::last_value<bool>,int,std::less<int>,boost::function<bool __stdcall(void),std::allocator<void> > >(const boost::last_value<bool> & c={...}, const std::less<int> & comp={...})  Line 198 + 0x85 C++
...
Do these observations suggest how I might successfully handle this callback from the release boost DLL?  Thanks in advance,
- Ashok Thirumurthi