【问题标题】:Shared library problems between C++11 and C++14C++11 和 C++14 之间的共享库问题
【发布时间】:2021-03-26 12:41:32
【问题描述】:

我不得不在我的项目中从 C++11 切换到 C++14 以使用为 C++14 编写的 Catch 测试框架(它不会用更少的东西编译)。一切都编译得很好。但是,在运行程序时,以下函数会导致一系列错误,这些错误似乎与 C++11 和 C++14 共享标准库文件之间的不匹配有关:

//it is called as such:
string p = "...";
handle_file(p);

//...
int handle_file (string p) {
        if (is_valid(p)) {
            return 0;
        }
        else return -1;
    }

gdb 中的错误跟踪显示:

Program received signal SIGABRT, Aborted.
0x00007ffff7299ef5 in raise () from /usr/lib/libc.so.6
(gdb) bt
#0  0x00007ffff7299ef5 in raise () from /usr/lib/libc.so.6
#1  0x00007ffff7283862 in abort () from /usr/lib/libc.so.6
#2  0x00007ffff72dbf38 in __libc_message () from /usr/lib/libc.so.6
#3  0x00007ffff72e3bea in malloc_printerr () from /usr/lib/libc.so.6
#4  0x00007ffff72e5113 in _int_free () from /usr/lib/libc.so.6
#5  0x00007ffff72e8ca8 in free () from /usr/lib/libc.so.6
#6  0x00007ffff76b76ea in operator delete (ptr=<optimized out>) at /build/gcc/src/gcc/libstdc++-v3/libsupc++/del_op.cc:49
#7  0x00007ffff76b76fa in operator delete (ptr=<optimized out>) at /build/gcc/src/gcc/libstdc++-v3/libsupc++/del_ops.cc:33
#8  0x000055555556c893 in __gnu_cxx::new_allocator<char>::deallocate (__t=<optimized out>, __p=<optimized out>, this=0x7fffffffd910)
    at /usr/include/c++/10.2.0/ext/new_allocator.h:133
#9  std::allocator_traits<std::allocator<char> >::deallocate (__n=<optimized out>, __p=<optimized out>, __a=...)
    at /usr/include/c++/10.2.0/bits/alloc_traits.h:492
#10 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_destroy (__size=<optimized out>, this=0x7fffffffd910)
    at /usr/include/c++/10.2.0/bits/basic_string.h:237
#11 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_dispose (this=0x7fffffffd910)
    at /usr/include/c++/10.2.0/bits/basic_string.h:232
#12 std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string (this=0x7fffffffd910, __in_chrg=<optimized out>)
    at /usr/include/c++/10.2.0/bits/basic_string.h:658
#13 Manager::handle_file (p ="./data/20pix", this=0x5555556c6d20)
    at src/manager.hpp:149

有人知道怎么解决吗?

【问题讨论】:

  • 你提出了一个异常。尝试在 try catch 块中捕获消息?

标签: c++ c++11 gdb c++14 catch2


【解决方案1】:

错误在malloc 内部,在它打印了一些错误消息(通常是double-free 或类似的东西)表明堆损坏之后。

虽然可能你有某种库不匹配,更有可能你有一个简单的堆损坏错误你自己 代码(溢出的堆缓冲区,双重删除,未分配的删除等),并且该错误现在只是暴露出来,而它之前仍然隐藏。

您的第一步应该是在ValgrindAddress Sanitizer 下运行程序,并修复这些工具报告的所有错误。

【讨论】:

  • 你是对的!谢谢。尽管不是 void,但另一个函数缺少返回声明,这就是导致内存泄漏的原因。
  • @theoremseeker 内存泄漏与您的问题无关,但缺少 return 语句可能会。附言您的程序完全构建的事实表明您没有启用警告(任何体面的编译器都会告诉您缺少return)。您应该立即启用并修复它们,以免浪费时间发现编译器会很乐意告诉您的问题。
猜你喜欢
  • 1970-01-01
  • 2012-10-27
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多