高翔slam14 project 出现double free or corruption (out)问题解决

问题

高翔slam project 0.3 在make的时候一切正常。但是在运行的时候会报错:double free or corruption (out)
在用gdb调试的时候,可以知道调试信息:

double free or corruption (out)

Program received signal SIGABRT, Aborted.
__GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51	../sysdeps/unix/sysv/linux/raise.c: 没有那个文件或目录.
(gdb) bt
#0  0x00007ffff57d9e97 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007ffff57db801 in __GI_abort () at abort.c:79
#2  0x00007ffff5824897 in __libc_message (action=action@entry=do_abort, fmt=fmt@entry=0x7ffff5951b9a "%s
")
    at ../sysdeps/posix/libc_fatal.c:181
#3  0x00007ffff582b90a in malloc_printerr (str=str@entry=0x7ffff5953870 "double free or corruption (out)") at malloc.c:5350
#4  0x00007ffff5832e75 in _int_free (have_lock=0, p=0x555555821f10, av=0x7ffff5b86c40 <main_arena>) at malloc.c:4278
#5  0x00007ffff5832e75 in __GI___libc_free (mem=0x555555821f20) at malloc.c:3124
#6  0x00007ffff50ecc4d in g2o::EdgeProjectP2MC_Intrinsics::~EdgeProjectP2MC_Intrinsics() () at /usr/local/lib/libg2o_types_sba.so
#7  0x00007ffff557b1f7 in g2o::Factory::registerType(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, g2o::AbstractHyperGraphElementCreator*) () at /usr/local/lib/libg2o_core.so
#8  0x00007ffff50e4b1a in _GLOBAL__sub_I_types_sba.cpp () at /usr/local/lib/libg2o_types_sba.so
#9  0x00007ffff7de5733 in call_init (env=0x7fffffffdc60, argv=0x7fffffffdc48, argc=2, l=<optimized out>) at dl-init.c:72
#10 0x00007ffff7de5733 in _dl_init (main_map=0x7ffff7ffe170, argc=2, argv=0x7fffffffdc48, env=0x7fffffffdc60) at dl-init.c:119
#11 0x00007ffff7dd60ca in _dl_start_user () at /lib64/ld-linux-x86-64.so.2
#12 0x0000000000000002 in  ()
#13 0x00007fffffffe01a in  ()
#14 0x00007fffffffe060 in  ()
#15 0x0000000000000000 in  ()

刚开始以为是g2o的问题,所以一直在搜索。

解决

就在高翔slam的gihub网址上看到了解决方案:link
set( CMAKE_CXX_FLAGS "-std=c++11 -march=native -O3" )改成set( CMAKE_CXX_FLAGS "-std=c++11 -O3" )
就删掉了一个-march=native然后重新编译,居然就可以运行了 。

资料查阅

可是据我所知-march=native应该是一个指定目标程序的cpu架构来进行程序优化。native就是相当于自检测cpu。总之-march是gcc优化选项。
具体参考:link

我查阅到gcc官网记录了这个bug:Bug c/70136
不过环境不一样,我的机器是:

Intel i7 6700k
ubuntu 18.04
gcc 5.5

具体原因后期再看,不过应该是环境的原因,和代码没关系。

5.6更新

貌似只要加了-march=native
所有的节点与边的析构函数都会报错。

原文地址:https://www.cnblogs.com/kidtic/p/14223679.html