gpt4 book ai didi

C++11 std::shared_ptr 工作正常,但 boost::shared_ptr 崩溃,这可能是什么原因?

转载 作者:太空狗 更新时间:2023-10-29 23:04:53 27 4
gpt4 key购买 nike

我有一个多线程程序(无法在此处重现——它有数千行)每次都与 C++11 (GCC 4.7.3) 完美配合,但在使用 C++03 时崩溃(使用 Boost 1.53)。

具体来说,我将 std::atomicstd::shared_ptr 替换为 boost::atomicboost: :shared_ptr 在我的代码中(并在 GCC 中用 -std=c++03 编译它)。代码在其他方面是相同的。

但是,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 版本上看到任何问题(我已经在 Windows 上的 Visual Studio 2013 和 Linux 上的当前 GCC 上测试过),但每次我在 C 上运行它时都会发生这种情况++03 版本,所以我怀疑这是我代码中的竞争条件,否则我现在应该已经在 C++11 版本中看到它了。

所以我有点困惑——boost::shared_ptrstd::shared_ptr 之间有什么区别可能会导致这种情况?


更新:

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

最佳答案

我想我找到了问题。

事实上,它不是使用 boost::shared_ptr,而是使用我代码中其他地方的 boost::atomic

boost::atomic 不会自动对其值进行零初始化!

关于C++11 std::shared_ptr 工作正常,但 boost::shared_ptr 崩溃,这可能是什么原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21200941/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com