В общем такие проблемы обычно решаются довольно быстро.
Но тут вообще в ступор встал.
В общем вылетает с эксепшином у меня вот в таком месте:
virtual bool some_member_func(std::string& a)
{
m_some_member_string += a; //m_some_member_string - тоже std::string
return true;
}
Исключение происходит на выделении памяти, потому что новый размер неадекватно большой (0x2dcf9d70).
Но, что самое интересное: состояние обоих переменных нормальное.
Переменная m_some_member_string (она фактически пустая):
+ std::_String_val<char,std::allocator<char> > {_Alval={...} } std::_String_val<char,std::allocator<char> >
npos 0xffffffff const unsigned int
+ _Bx {_Buf=0x04aeef58 "" _Ptr=0x2e900000 <Bad Ptr> } std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Bxty
_Mysize 0x00000000 unsigned int
_Myres 0x0000000f unsigned int
Переменная а(в ней 16 байт записано):
+ std::_String_val<char,std::allocator<char> > {_Alval={...} } std::_String_val<char,std::allocator<char> >
npos 0xffffffff const unsigned int
+ _Bx {_Buf=0x04aedf08 "8’™ММММММММММММ" _Ptr=0x03999238 "502 Unknown Host" } std::basic_string<char,std::char_traits<char>,std::allocator<char> >::_Bxty
_Mysize 0x00000010 unsigned int
_Myres 0x0000009f unsigned int
Что-то нелепое происходит в файле xstring line 954:
_Myt& __CLR_OR_THIS_CALL append(const _Myt& _Right,
size_type _Roff, size_type _Count)
{ // append _Right [_Roff, _Roff + _Count)
if (_Right.size() < _Roff)
_String_base::_Xran(); // _Roff off end
size_type _Num = _Right.size() - _Roff; //каким-то нелепым образом, в значение _Num попадает 0x2dcf9d70, хотя я ясно вижу в отладчике что _Right.size() равен 16 а _Roff = 0!!!
if (_Num < _Count)
_Count = _Num; // trim _Count to size
if (npos - _Mysize <= _Count || _Mysize + _Count < _Mysize)
_String_base::_Xlen(); // result too long
if (0 < _Count && _Grow(_Num = _Mysize + _Count))
{ // make room and append new stuff
_Traits_helper::copy_s<_Traits>(_Myptr() + _Mysize, _Myres - _Mysize,
_Right._Myptr() + _Roff, _Count);
_Eos(_Num);
}
return (*this);
}
Обе этих переменных 100% используются только в этом потоке, никто к ним доступа не имеет.
Я сначала думал что какой-то другой поток затер в памяти эту переменную после вычисления реальной длины, но ошибка воспроизводится ровно в том же месте каждый раз.
У кого есть какие мнения как ловить багу.
Я склоняюсь все таки в сторону что кто-то херит память... но как ловить ?