C ++ 11 std :: shared_ptr工作正常,但是boost :: shared_ptr崩溃了,这是什么原因引起的?

用户541686

我有一个多线程程序(无法在这里重现它-成千上万行),每次都可以与C ++ 11(GCC 4.7.3)完美配合,但是在使用C ++ 03(带有Boost时会崩溃) 1.53)。

具体来说,我代std::atomicstd::shared_ptrboost::atomicboost::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有value 0x3f9dafee19598306,它看起来错了并且未对齐(后者可能是崩溃的原因)。

我从未在C ++ 11版本上看到任何问题(我已经在Windows的Visual Studio 2013和Linux的当前GCC上进行了测试),但是每次我在C ++ 03上运行它时,都会发生这种情况版本,所以我怀疑这是我代码中的争用条件,或者到目前为止,我是否会在C ++ 11版本中看到它。

所以我很困惑一点-有什么区别boost::shared_ptrstd::shared_ptr可能被造成的?


更新:

make_shared也在使用...,好像我避免使用时make_shared,在Linux上也使用C ++ 11版本无限循环(在Windows上仍然可以正常工作)。虽然不确定这意味着什么。

用户541686

我想我找到了问题。

实际上,它不是与boost::shared_ptr,而是与boost::atomic我代码中的其他地方。

boost::atomic 不会自动将其值清零

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C++ 中 std::shared_ptr 数组的工作原理

来自分类常见问题

在C ++中,空std :: shared_ptr和空std :: shared_ptr有什么区别?

来自分类Dev

std set of boost :: shared_ptr <string>

来自分类Dev

std :: unordered_map插入错误shared_ptr C ++

来自分类Dev

C ++使用指向std :: shared_ptr的Raw指针

来自分类Dev

std :: unordered_map插入错误shared_ptr C ++

来自分类Dev

C ++ std :: shared_ptr参考的reinterpret_cast优化

来自分类Dev

我可以用std :: shared_ptr而不是boost :: shared_ptr构建Boost库

来自分类Dev

如何在boost :: object_pool中使用boost :: shared_ptr / std :: shared_ptr?

来自分类Dev

如何在boost :: object_pool中使用boost :: shared_ptr / std :: shared_ptr?

来自分类Dev

QVariant与std :: shared_ptr

来自分类Dev

QVariant与std :: shared_ptr

来自分类Dev

使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

来自分类Dev

使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

来自分类Dev

使用std :: shared_ptr而不是boost :: shared_ptr时编译失败

来自分类Dev

内存无法释放std :: list <std :: shared_ptr <std :: string >> C ++

来自分类Dev

std :: shared_ptr在复制对象时引起问题

来自分类Dev

std :: unique_ptr和std :: shared_ptr之间的破坏行为差异的原理是什么?

来自分类Dev

使用std :: move与std :: shared_ptr

来自分类Dev

使用boost :: shared_ptr <std :: list <T >>初始化boost :: shared_ptr <std :: vector <T >>

来自分类Dev

C ++-shared_ptr的数组

来自分类Dev

std :: shared_ptr和继承

来自分类Dev

std :: shared_ptr深层复制对象

来自分类Dev

std :: function和shared_ptr

来自分类Dev

使用* this作为std :: shared_ptr

来自分类Dev

数据与memcpy的std :: shared_ptr分配

来自分类Dev

std :: shared_ptr预分配内存

来自分类Dev

可重用的std :: shared_ptr

来自分类Dev

std :: shared_ptr深层复制对象

Related 相关文章

  1. 1

    C++ 中 std::shared_ptr 数组的工作原理

  2. 2

    在C ++中,空std :: shared_ptr和空std :: shared_ptr有什么区别?

  3. 3

    std set of boost :: shared_ptr <string>

  4. 4

    std :: unordered_map插入错误shared_ptr C ++

  5. 5

    C ++使用指向std :: shared_ptr的Raw指针

  6. 6

    std :: unordered_map插入错误shared_ptr C ++

  7. 7

    C ++ std :: shared_ptr参考的reinterpret_cast优化

  8. 8

    我可以用std :: shared_ptr而不是boost :: shared_ptr构建Boost库

  9. 9

    如何在boost :: object_pool中使用boost :: shared_ptr / std :: shared_ptr?

  10. 10

    如何在boost :: object_pool中使用boost :: shared_ptr / std :: shared_ptr?

  11. 11

    QVariant与std :: shared_ptr

  12. 12

    QVariant与std :: shared_ptr

  13. 13

    使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

  14. 14

    使用C ++ std :: unique_ptr <>或std :: shared_ptr <>来管理Objective-C对象

  15. 15

    使用std :: shared_ptr而不是boost :: shared_ptr时编译失败

  16. 16

    内存无法释放std :: list <std :: shared_ptr <std :: string >> C ++

  17. 17

    std :: shared_ptr在复制对象时引起问题

  18. 18

    std :: unique_ptr和std :: shared_ptr之间的破坏行为差异的原理是什么?

  19. 19

    使用std :: move与std :: shared_ptr

  20. 20

    使用boost :: shared_ptr <std :: list <T >>初始化boost :: shared_ptr <std :: vector <T >>

  21. 21

    C ++-shared_ptr的数组

  22. 22

    std :: shared_ptr和继承

  23. 23

    std :: shared_ptr深层复制对象

  24. 24

    std :: function和shared_ptr

  25. 25

    使用* this作为std :: shared_ptr

  26. 26

    数据与memcpy的std :: shared_ptr分配

  27. 27

    std :: shared_ptr预分配内存

  28. 28

    可重用的std :: shared_ptr

  29. 29

    std :: shared_ptr深层复制对象

热门标签

归档