Есть например некий объект, использующий concurrent_queue из номоводного Concurrency от vs2010. В деструкторе зовется как положено метод clear. И падает иногда. Очень хитро падает, тварь - только на smp машинах с xp. Под другими (проверялось на w7 & ws2008r2) не падает
Оказалось что subj глючен:
char _Buf[sizeof(_Ty)]; // <-- тут создаем неинициализированный буфер
if (!_Internal_pop_if_present(reinterpret_cast<_Ty*>(_Buf)))
virtual void _Assign_and_destroy_item( void* _Dst, _Page& _Src, size_t _Index )
{
_Ty& _From = _Get_ref(_Src,_Index);
_Destroyer _D(_From);
*static_cast<_Ty*>(_Dst) = _From; // а тут присваиваем неинициализированному объекту по адресу
_Buf. Соотв-но оператор = тошнит
}
лучше всего использовать простой но рабочий код вроде
while(queue.try_pop(dst)){}
Ненависть, ненависть, ненависть
Комментариев нет:
Отправить комментарий