c++ - 应用程序退出时出现 SegFault

标签 c++ valgrind

我在工作中使用的应用程序之一遇到了一个奇怪且烦人的问题。该应用程序是用 C++ 编写的,当应用程序终止(主函数返回或调用 exit)时,它会因段错误而崩溃。段错误似乎是由 basic_string 类析构函数中的双重释放指针引起的。我无法添加源代码,但我可以说该应用程序非常简单,并且我没有直接在代码中使用任何指针。该应用程序只是从库中调用函数。

Valgrid 发现以下问题:

==5402== Invalid read of size 4
==5402==    at 0x549F05F: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (atomicity.h:49)
==5402==    by 0x41D1BA4: ??? (in ../Functions.so)
==5402==    by 0x436D873: ??? (in ../Functions.so)
==5402==    by 0x967674: _dl_fini (in /lib/ld-2.12.so)
==5402==    by 0x9A7EAE: exit (in /lib/libc-2.12.so)
==5402==    by 0x810F8C2: main (Checker.C:146)
==5402==  Address 0x55ec808 is 8 bytes inside a block of size 15 free'd
==5402==    at 0x4007895: operator delete(void*) (vg_replace_malloc.c:480)
==5402==    by 0x549EF67: std::string::_Rep::_M_destroy(std::allocator<char> const&) (new_allocator.h:110)
==5402==    by 0x810F8C2: main (Checker.C:146)
==5402==
==5402== Invalid free() / delete / delete[] / realloc()
==5402==    at 0x4007895: operator delete(void*) (vg_replace_malloc.c:480)
==5402==    by 0x549EF67: std::string::_Rep::_M_destroy(std::allocator<char> const&) (new_allocator.h:110)
==5402==    by 0x41D1BA4: ??? (in ..../Functions.so)
==5402==    by 0x436D873: ??? (in .../Functions.so)
==5402==    by 0x967674: _dl_fini (in /lib/ld-2.12.so)
==5402==    by 0x9A7EAE: exit (in /lib/libc-2.12.so)
==5402==    by 0x810F8C2: main (Checker.C:146)
==5402==  Address 0x55ec800 is 0 bytes inside a block of size 15 free'd
==5402==    at 0x4007895: operator delete(void*) (vg_replace_malloc.c:480)
==5402==    by 0x549EF67: std::string::_Rep::_M_destroy(std::allocator<char> const&) (new_allocator.h:110)
==5402==    by 0x810F8C2: main (Checker.C:146)
==5402==

该应用程序链接到共享库和静态库。 Function.so 是一个共享库,可能包含一些静态代码。此问题与链接阶段有关,因为根据库链接到我的可执行文件的顺序,应用程序可能不会崩溃。

我真的很努力解决这个问题,你知道这个问题的根本原因是什么吗?有什么建议如何继续调查这个问题吗?

最佳答案

此问题的根本原因是代码中某处的错误。 bug 可以是任何东西。野指针取消引用、超出数组末尾或任何其他无数种错误。 C++ 代码中的错误并不一定意味着应用程序会立即崩溃。应用程序可以继续执行,但稍后当它尝试访问由于错误而损坏的内存时会崩溃。

您的代码中存在一个错误,可能会导致内存损坏,从而在应用程序终止时触发此崩溃。您需要找到它并修复它。欢迎使用 C++。

关于c++ - 应用程序退出时出现 SegFault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38787869/

相关文章:

c++ - 如何在 std::map 中使用结构作为键

c++ - 编译器优化忽略循环中非无效函数调用

c++ - 返回字符串的静态方法

c++ - 为什么 QApplication 会出现内存泄漏?

c++ - 在使用模板类制作自定义 vector 时,我应该如何处理析构函数?

C++ 模板对方法的限制

c++ - 指向抽象模板基类的指针?

C++ valgrind : Conditional jump or move depends on uninitialised value(s) don't know what to initialize

c - g_strdupv 函数的段错误

c - Valgrind 在尝试释放 malloc 结构时报告内存错误