C++ 调用\u do\u global\u dtors\u aux时双重释放或损坏(!prev)

C++ 调用\u do\u global\u dtors\u aux时双重释放或损坏(!prev),c++,gcc,memory-management,g++,C++,Gcc,Memory Management,G++,在我的应用程序一切正常后,我收到此错误消息 /lib64/libc.so.6[0x3f1ee70d7f] /lib64/libc.so.6(cfree+0x4b)[0x3f1ee711db] /home/user/workspace/NewProject/build/bin/TestApp(_ZN9__gnu_cxx13new_allocatorIN5boost10shared_ptrINS1_5uuids4uuidEEEE10deallocateEPS5_m+0x20)[0x49c174] /

在我的应用程序一切正常后,我收到此错误消息

/lib64/libc.so.6[0x3f1ee70d7f]
/lib64/libc.so.6(cfree+0x4b)[0x3f1ee711db]
/home/user/workspace/NewProject/build/bin/TestApp(_ZN9__gnu_cxx13new_allocatorIN5boost10shared_ptrINS1_5uuids4uuidEEEE10deallocateEPS5_m+0x20)[0x49c174]
/home/user/workspace/NewProject/build/bin/TestApp(_ZNSt12_Vector_baseIN5boost10shared_ptrINS0_5uuids4uuidEEESaIS4_EE13_M_deallocateEPS4_m+0x32)[0x495b84]
/home/user/workspace/NewProject/build/bin/TestApp(_ZNSt12_Vector_baseIN5boost10shared_ptrINS0_5uuids4uuidEEESaIS4_EED2Ev+0x47)[0x49598b]
/home/user/workspace/NewProject/build/bin/TestApp(_ZNSt6vectorIN5boost10shared_ptrINS0_5uuids4uuidEEESaIS4_EED1Ev+0x65)[0x48bf27]
/lib64/libc.so.6(__cxa_finalize+0x8e)[0x3f1ee337fe]
/home/user/workspace/NewProject/build/components/lib_path/libhelper-d.so[0x2aaaab052b36]
如果我在
gdb
中运行程序,我可以得到以下回溯,但这是我得到的全部:

#0  0x0000003f1ee30285 in raise () from /lib64/libc.so.6
#1  0x0000003f1ee31d30 in abort () from /lib64/libc.so.6
#2  0x0000003f1ee692bb in __libc_message () from /lib64/libc.so.6
#3  0x0000003f1ee70d7f in _int_free () from /lib64/libc.so.6
#4  0x0000003f1ee711db in free () from /lib64/libc.so.6
#5  0x000000000049c174 in __gnu_cxx::new_allocator<boost::shared_ptr<boost::uuids::uuid> >::deallocate (this=0x2aaaab2cea50, __p=0x1cfd8d0)
    at /opt/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.4.5/../../../../include/c++/4.4.5/ext/new_allocator.h:95
#6  0x0000000000495b84 in std::_Vector_base<boost::shared_ptr<boost::uuids::uuid>, std::allocator<boost::shared_ptr<boost::uuids::uuid> > >::_M_deallocate (
    this=0x2aaaab2cea50, __p=0x1cfd8d0, __n=8) at /opt/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.4.5/../../../../include/c++/4.4.5/bits/stl_vector.h:146
#7  0x000000000049598b in std::_Vector_base<boost::shared_ptr<boost::uuids::uuid>, std::allocator<boost::shared_ptr<boost::uuids::uuid> > >::~_Vector_base (
    this=0x2aaaab2cea50, __in_chrg=<value optimized out>)
    at /opt/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.4.5/../../../../include/c++/4.4.5/bits/stl_vector.h:132
#8  0x000000000048bf27 in std::vector<boost::shared_ptr<boost::uuids::uuid>, std::allocator<boost::shared_ptr<boost::uuids::uuid> > >::~vector (this=0x2aaaab2cea50,
    __in_chrg=<value optimized out>) at /opt/local/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.4.5/../../../../include/c++/4.4.5/bits/stl_vector.h:313
#9  0x0000003f1ee337fe in __cxa_finalize () from /lib64/libc.so.6
#10 0x00002aaaab052b36 in __do_global_dtors_aux ()
from /home/user/workspace/NewProject/build/components/lib_path/libhelper-d.so
#11 0x0000000000000000 in ?? ()
/lib64/libc.so.6中的raise()中的0 0x0000003f1ee30285 #1 0x0000003f1ee31d30位于/lib64/libc.so.6的abort()中 #来自/lib64/libc.so.6的消息()中的0x0000003f1ee692bb #3 0x0000003f1ee70d7f在/lib64/libc.so.6中的_int_free()中 #/lib64/libc.so.6中的free()中的4 0x0000003f1ee711db #5 0x000000000049c174在uuu gnu_cxx::新的u分配器::解除分配(this=0x2aaab2cea50,uuu p=0x1cfd8d0) 在/opt/local/bin/./lib/gcc/x86_64-unknown-linux-gnu/4.4.5/../../../../../../include/c++/4.4.5/ext/new_分配器。h:95 #标准中的6 0x0000000000495b84:_Vector_base:_M_deallocate:_M_( this=0x2aaab2cea50,u p=0x1cfd8d0,u n=8)at/opt/local/bin//lib/gcc/x86_64-unknown-linux-gnu/4.4.5/../../../../../include/c++/4.4.5/bits/stl-vector.h:146 #标准中的7 0x000000000049598b::_Vector_base::~\u Vector_base( 这=0x2AAAB2CEA50,uuu in_uchrg=) 在/opt/local/bin/./lib/gcc/x86_64-unknown-linux-gnu/4.4.5/../../../../../../include/c++/4.4.5/bits/stl_vector.h:132 #std::vector::~vector中的8 0x000000000048bf27(此=0x2AAAB2CEA50, __在/opt/local/bin/./lib/gcc/x86_64-unknown-linux-gnu/4.4.5/../../../../../../include/c++/4.4.5/bits/stl_vector.h:313 #9 0x0000003f1ee337fe位于/lib64/libc.so.6中的uuu cxa_finalize()中 #10 0x00002AAAB052B36英寸(全球数据器辅助) 来自/home/user/workspace/NewProject/build/components/lib_path/libhelper-d.so #11 0x0000000000000000英寸??() 我真的不知道如何从这里开始


更新我忘了提到错误出现时,出现在错误中的唯一类型的全局变量已被清除
m_uuids.size()==0

出现错误的地方可能有点误导。我最好的猜测是,你有一个共享指针向量,当它被销毁时,其中一个(至少)共享指针试图删除它指向的对象,却发现它已经被删除了


您是否在任何地方混合原始指针和共享指针?如果是这样的话,你可能会发现一个看起来非常无害的
delete
,它正在把地毯从你的
shared\u ptr

的脚下拉下来,我在使用glog时也遇到了同样的问题。在我的例子中,是这样的情况:

  • 我有一个共享库,称之为“公共库”,所以链接了glog
  • 我的主要可执行文件,称之为“app”,也链接到glog,并链接到common.so
  • 我遇到的问题是glog在.so和executeable中都是静态链接的。当我将#1和#2都更改为链接.a时,问题就消失了,而不是.a

    不确定这是你的问题,但可能是。一般来说,释放内存时的损坏通常意味着您损坏了内存池(例如删除同一指针两次)。我相信在这两种情况下,我都会在同一个全局指针(在我的例子中是一个std::字符串)上得到两次清理行为

    更新:
    经过大量调查,这很可能就是问题所在。发生的情况是,每个可执行文件和.so都有一个std::string类型的全局变量(glog的一部分)。这些std::string全局变量必须在动态链接器/加载器加载对象(exe、.so)时构造。此外,在_exit处使用为每个对象添加一个析构函数以进行清理。但是,当调用退出时的函数时,两个全局引用都指向同一个std::string。这意味着std::string析构函数被调用两次,但调用的对象是同一个对象。然后对同一内存位置调用两次free。全局std::string(或任何具有构造函数的类)是个坏主意。如果您选择基于.so的体系结构(一个好主意),那么您必须小心所有第三方库以及它们如何处理全局文件。通过链接到。所以对于所有第三方库,您可以避免最危险的情况。

    这正是他们制作valgrind等程序的原因。您错误地认为您的应用程序“一切正常”。你的应用程序有未定义的行为,因为你编码错误,你现在看到了这个错误的后果。我真的不知道如果我们看不到代码,我们怎么能找到一个bug。你也可能正在释放一个已经释放的内存…或者删除一个已经删除的区域使用
    -ggdb
    编译并使用
    gdb
    列出代码的功能可能会有所帮助。(如果确实是双重释放,请检查是否没有释放析构函数自己处理的类中的一些内存。)