C++ 执行析构函数时,服务器应用程序总是崩溃

C++ 执行析构函数时,服务器应用程序总是崩溃,c++,valgrind,C++,Valgrind,服务器应用程序总是在代码的同一行崩溃。我使用gdb和valgrind来发现问题,但崩溃点似乎在编译器创建的析构函数中,valgrind是这么说的: ==27785== Invalid read of size 8 ==27785== at 0x5CDCE25: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (in /usr/l

服务器应用程序总是在代码的同一行崩溃。我使用gdb和valgrind来发现问题,但崩溃点似乎在编译器创建的析构函数中,valgrind是这么说的:

==27785== Invalid read of size 8
==27785==    at 0x5CDCE25: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (in /usr/lib64/libstdc++.so.6.0.8)
==27785==    by 0x5812F4: Pet::BookConfiguration::~BookConfiguration() (BookConfiguration.h:8)
==27785==    by 0x5EDEC4: void std::_Destroy<Pet::BookConfiguration>(Pet::BookConfiguration*) (stl_construct.h:107)
==27785==    by 0x5EDEE2: void std::__destroy_aux<Pet::BookConfiguration*>(Pet::BookConfiguration*, Pet::BookConfiguration*, __false_type) (stl_construct.h:12
2)
==27785==    by 0x5EDF17: void std::_Destroy<Pet::BookConfiguration*>(Pet::BookConfiguration*, Pet::BookConfiguration*) (stl_construct.h:155)
==27785==    by 0x5EDF3A: void std::_Destroy<Pet::BookConfiguration*, Pet::BookConfiguration>(Pet::BookConfiguration*, Pet::BookConfiguration*, std::allocator
<Pet::BookConfiguration>) (stl_construct.h:182)
==27785==    by 0x5F5C09: std::vector<Pet::BookConfiguration, std::allocator<Pet::BookConfiguration> >::~vector() (stl_vector.h:272)
==27785==    by 0x5F6A22: Pet::ShopModel::~ShopModel() (ShopModel.h:15)
==27785==    by 0x5C59E3: Pet::PetProcessor::climbFight(Pet::SourceList&, Pet::TBuffer&) (PetProcessor.cpp:1796)
==27785==    by 0x589263: Pet::Processor::execute(Pet::SourceList&, unsigned short, Pet::TBuffer&) (Processor.cpp:22)
==27785==    by 0x578627: Pet::JobThread<Pet::PetProcessor>::run() (JobThread.h:66)
==27785==    by 0x4F81AB2: Poco::PooledThread::run() (in /data/home/app100619699/pet_srv/lib/libPocoFoundation.so.11)
==27785==  Address 0x900df30 is 7 bytes after a block of size 57 free'd
==27785==    at 0x4A201B6: operator delete(void*) (vg_replace_malloc.c:457)
==27785==    by 0x5CDCE59: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (in /usr/lib64/libstdc++.so.6.0.8)
==27785==    by 0x5CFFE6: Pet::PetProcessor::getUserBag(Pet::SourceList&, Pet::TBuffer&) (PetProcessor.cpp:446)
==27785==    by 0x589263: Pet::Processor::execute(Pet::SourceList&, unsigned short, Pet::TBuffer&) (Processor.cpp:22)
==27785==    by 0x578627: Pet::JobThread<Pet::PetProcessor>::run() (JobThread.h:66)
==27785==    by 0x4F81AB2: Poco::PooledThread::run() (in /data/home/app100619699/pet_srv/lib/libPocoFoundation.so.11)
==27785==    by 0x4F7D1D5: Poco::ThreadImpl::runnableEntry(void*) (in /data/home/app100619699/pet_srv/lib/libPocoFoundation.so.11)
==27785==    by 0x54DE192: start_thread (in /lib64/libpthread-2.4.so)
==27785==    by 0x6161F0C: clone (in /lib64/libc-2.4.so)
==27785==大小为8的无效读取
==27785==at 0x5CDCE25:std::basic_string::~basic_string()(在/usr/lib64/libstdc++.so.6.0.8中)

==27785==by 0x5812F4:Pet::BookConfiguration::~BookConfiguration()(BookConfiguration.h:8) ==27785==by 0x5EDEC4:void std:_Destroy(Pet::BookConfiguration*)(stl_construct.h:107) ==27785==by 0x5EDEE2:void std:uu destroy_aux(Pet::BookConfiguration*,Pet::BookConfiguration*,uu false_type)(stl_construct.h:12) 2) ==27785==by 0x5EDF17:void std:_Destroy(Pet::BookConfiguration*,Pet::BookConfiguration*)(stl_construct.h:155) ==27785==by 0x5EDF3A:void std:_Destroy(Pet::BookConfiguration*,Pet::BookConfiguration*,std::分配器 )(stl_Construction.h:182) ==27785==by 0x5F5C09:std::vector::~vector()(stl_vector.h:272) ==27785==by 0x5F6A22:Pet::ShopModel::~ShopModel()(ShopModel.h:15) ==27785==by 0x5C59E3:Pet::PetProcessor::grampfight(Pet::SourceList&,Pet::TBuffer&)(PetProcessor.cpp:1796) ==27785==by 0x589263:Pet::Processor::execute(Pet::SourceList&,unsigned short,Pet::TBuffer&)(Processor.cpp:22) ==27785==by 0x578627:Pet::JobThread::run()(JobThread.h:66) ==27785==by 0x4F81AB2:Poco::PooledThread::run()(在/data/home/app100619699/pet_srv/lib/libPocoFoundation.so.11中) ==27785==地址0x900df30是大小为57 free'd的块后的7个字节 ==27785==at 0x4A201B6:运算符删除(void*)(vg_replace_malloc.c:457) ==27785==by 0x5CDCE59:std::basic_string::~basic_string()(in/usr/lib64/libstdc++.so.6.0.8) ==27785==0x5CFFE6:Pet::PetProcessor::getUserBag(Pet::SourceList&,Pet::TBuffer&)(PetProcessor.cpp:446) ==27785==by 0x589263:Pet::Processor::execute(Pet::SourceList&,unsigned short,Pet::TBuffer&)(Processor.cpp:22) ==27785==by 0x578627:Pet::JobThread::run()(JobThread.h:66) ==27785==by 0x4F81AB2:Poco::PooledThread::run()(在/data/home/app100619699/pet_srv/lib/libPocoFoundation.so.11中) ==27785==0x4F7D1D5:Poco::ThreadImpl::runnableEntry(void*)(在/data/home/app100619699/pet_srv/lib/libPocoFoundation.so.11中) ==27785==by 0x54DE192:start_线程(在/lib64/libpthread-2.4.so中) ==27785==by 0x6161F0C:clone(在/lib64/libc-2.4.so中)
这里提到的两个字符串没有关系,它们都是局部变量。谁能告诉我为什么会发生这种情况,或者我如何找到真正的碰撞问题


Pet::BookConfiguration::~BookConfiguration()
是编译器创建的析构函数。它不需要做任何事情,因为该类没有可释放的资源。

从错误消息中可以看出,您显然正在使用线程以及线程之间的某种类型的共享存储池。您可能会遇到这样的问题:当您关闭服务器时,两个不同的线程正试图销毁共享资源,而第二个线程将创建崩溃条件,因为销毁共享对象两次是未定义的行为


请记住,两个独立的线程实际上不需要使用同一个共享对象,但是如果一个线程销毁了另一个线程正在使用对象的池,那么第二个线程就不能销毁池中的该对象,因为第一个线程已经销毁了该资源。因此,您可能会遇到排序问题、线程资源之间的所有权问题,或者两者兼而有之。

~BookConfiguration()
中会发生什么?Pet::BookConfiguration::~BookConfiguration()是编译器创建的析构函数。它需要注意,因为这个类没有可释放的资源。你能做一个吗?我不能,因为在其他地方使用了相同的代码,但只在这里冲突。@user1400047似乎你已经释放了一个字符串的内存,你以后试图复制它;请参见
Pet::PetProcessor::getUserBag
,特别是PetProcessor.cpp的第446行