C++11 std::shared_ptr работает нормально, но boost::shared_ptr дает сбой, что может вызвать это?
У меня есть многопоточная программа (не могу воспроизвести ее здесь - это тысячи строк), которая прекрасно работает с C++11 (GCC 4.7.3) каждый раз, но не работает при использовании C++03 (с Boost 1,53).
Конкретно подставляю std::atomic
а также std::shared_ptr
с boost::atomic
а также boost::shared_ptr
в моем коде (и компилируя его с -std=c++03
в GCC). В остальном код такой же.
Тем не менее, версия C++03/Boost аварийно завершает работу или зацикливается навсегда. Когда это терпит крах, это делает так внутри здесь:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff4dc2700 (LWP 4065)]
0x000000000043d0c8 in boost::detail::sp_counted_base::release() ()
Разборка для этого кажется:
(gdb) disas 0x000000000043d0c8
Dump of assembler code for function _ZN5boost6detail15sp_counted_base7releaseEv:
0x000000000043d0b0 <+ 0>: mov QWORD PTR [rsp-0x8],rbp
0x000000000043d0b5 <+ 5>: mov ebp,0xffffffff
0x000000000043d0ba <+10>: mov QWORD PTR [rsp-0x10],rbx
0x000000000043d0bf <+15>: mov eax,ebp
0x000000000043d0c1 <+17>: sub rsp,0x18
0x000000000043d0c5 <+21>: mov rbx,rdi
=> 0x000000000043d0c8 <+24>: lock xadd DWORD PTR [rdi+0x8],eax
0x000000000043d0cd <+29>: cmp eax,0x1
0x000000000043d0d0 <+32>: je 0x43d0e8 <_ZN5boost6detail15sp_counted_base7releaseEv+56>
0x000000000043d0d2 <+34>: mov rbx,QWORD PTR [rsp+0x8]
0x000000000043d0d7 <+39>: mov rbp,QWORD PTR [rsp+0x10]
0x000000000043d0dc <+44>: add rsp,0x18
0x000000000043d0e0 <+48>: ret
я вижу rdi
имеет значение 0x3f9dafee19598306
, который выглядит неправильно и не выровнен (последний, вероятно, является причиной сбоя).
Я никогда не видел проблем с версией C++ 11 (я тестировал ее как на Visual Studio 2013 в Windows, так и на текущем GCC в Linux), но это происходит каждый раз, когда я запускаю его на C++ 03 версия, так что я сомневаюсь, что это условие гонки в моем коде, иначе я бы уже видел это в версии C++ 11.
Так что я немного запутался - какая разница между boost::shared_ptr
а также std::shared_ptr
может быть причиной этого?
Обновить:
я использую make_shared
а также... и кажется, что когда я избегаю использовать make_shared
, бесконечные циклы версии C++ 11 в Linux тоже (все еще отлично работает в Windows). Не уверен, что это означает, хотя.
1 ответ
Я думаю, что нашел проблему.
Это было, на самом деле, не с boost::shared_ptr
, но с boost::atomic
в другом месте в моем коде.
boost::atomic
автоматически не обнуляет его значение!