首页 > 其他分享 >g2o运行报错double free or corruption (out)

g2o运行报错double free or corruption (out)

时间:2023-07-04 11:02:16浏览次数:56  
标签:ceres eigen double free 问题 编译 报错 g2o

问题

项目中调用了g2o,编译没有问题,但是运行的时候报错了,报错的位置是g2o的SparseOptimizer类的析构函数里调用的clear()函数.明明上一个项目运行过程中没遇到这种g2o内部的问题,而且我上一个项目到现在,没有更改过g2o库,就很懵,不知道该怎么解决这个问题.

解决过程

  1. 看了clear()的源码,只是简单的关于vertices和edges的指针数组的释放,于是我猜想是不是vertice和edge对象的某些变量没有赋值而导致内存报错,为了验证猜想,尝试了创建vertice指针后后直接delete该指针是没有问题的,但是传入SparseOptimizer后再delete,就会报内存错误.

  2. 然后又分析了SparseOptimizer的addVertex()函数,只是一些关于std库的vector和map数据结构的创建和赋值操作,没找到问题.于是准备重新安装了最新的g2o,以及它的依赖库,

  3. 升级安装过程中,ceres2.1版本弃用了localParamaters.改成了Manifold,还增加了对gpu的支持,因此增加了项目代码修改的工作量.

  4. 改完代码,编译项目的时候出现了关于ceres找不到参数的问题(there are no arguments to ‘CHECK_EQ’ that depend on a template parameter),这个错误是因为只更新了ceres,而没有同步更新g2o造成的(因为安装g2o的时候,会把cere头文件安装到自己的外部库里,而不是调用系统的ceres头文件).但因为刚升级安装了新版ceres,并且同步更新了自己的项目代码,而且错误处没有关于g2o的字眼,就使劲找ceres的问题,把源码也分析了个遍,觉得一切都合理,没有问题.找问题无果,才想到把g2o也升级安装一下再试一下,结果问题没有了.苦笑.浪费了多少宝贵时间啊!

  5. 升级完库,发现最开始要解决的问题还在.于是,打开O3编译,并断点调试看能不能找到解决问题的新思路,逐个打断点调试的时候,发现在创建Vertex指针的时候,会跳转到eigen库Memery.h的Eigen::internal::aligned_malloc函数,然后,恍然大悟!绝对是eigen内存问题,但我明明记得我没有改动eigen库,升级安装g2o依赖库的时候,也没有重新编译eigen,因为它已经是比较新的版本了,结果没想到啊,重新安装了最新的eigen3.4,问题就解决了.

  6. 这个问题2年前遇到过,但是当时了解到高版本的eigen已经解决内存报错的问题,一开始压根就没有考虑过是eigen库的问题.

教训

  1. 一般开源库有问题,先考虑把有问题的库,以及相关依赖库更新一下.
  2. 升级更新库的过程中, 要把相关依赖的库都更新完,再编译运行,不能只更新部分,然后去分析一些其奇怪问题.
  3. 对于无从下手的问题,要用非优化编译O3,定位到最内核的问题.

标签:ceres,eigen,double,free,问题,编译,报错,g2o
From: https://www.cnblogs.com/iamheying/p/17525101.html

相关文章

  • go get -u failed 失败 报错
    panic:internalerror:can'tfindreasonforrequirementongithub.com/pkg/[email protected][running]:cmd/go/internal/modget.(*resolver).updateBuildList.func1({{0x140000ba378,0x15},{0x14000110996,0x6}})/usr/local/go/src/cmd/go/......
  • stm32移植FreeRTOS(手动)
    使用软件版本1.cubemxv5.3.02.stm32芯片包:Keil.STM32F4xx_DFP.2.16.0/Keil.STM32F1xx_DFP.2.4.03.FreeRTOS版本:FreeRTOSv202212.004.ARM编译器版本AC5,注意:AC6编译器使用ARMClang编译,本教程将不再适用移植步骤1.FreeRTOSsource文件夹下的如下文件拷贝到keil工程2.在keil......
  • 7.3 轮播图图片路径报错的解决办法
    图片导入media文件夹后,启动前端打开主页界面,一直显示找不到图片的路径一直报/banner/banner.pngnotfound缺少media路径后来发现是dev配置文件中缺少了media的配置 需要填入如上图所示MEDIA_URL配置,之后只要用到media文件夹下的资源就会自动拼接media路径......
  • 8.new-delete操作与malloc-free的操作异同
    相同点●都可用于内存的动态申请和释放●new和malloc都可以分配指定大小的内存块,并且分配的内存都在堆上。●new和malloc的结果都返回一个指向已分配内存的指针。●都允许使用字面量作为参数来分配内存。不同点●前者是C++运算符,后者是C/C++语言标准库函数●new自动计算要......
  • 12.被free回收的内存是立即返还给操作系统吗?
    不是的,被free回收的内存会首先被ptmalloc使用双链表保存起来,当用户下一次申请内存的时候,会尝试从这些内存中寻找合适的返回。这样就避免了频繁的系统调用,占用过多的系统资源。同时ptmalloc也会尝试对小块内存进行合并,避免过多的内存碎片。......
  • 11.既然有了malloc-free,C++中为什么还需要new-delete呢?直接用malloc-free不好吗?
    malloc/free和new/delete都是用来申请内存和回收内存的。在对非基本数据类型的对象使用的时候,对象创建的时候还需要执行构造函数,销毁的时候要执行析构函数。而malloc/free是库函数,是已经编译的代码,所以不能把构造函数和析构函数的功能强加给malloc/free,所以new/delete是必不可少......
  • Maven 报错处理
    从svn拉项目时,如果一个项目有多个子工程,1). 直接从trunk下拉项目,例如wm6-jzmd-project-latest(荆州电子)、wm6-ttbeer-project(青啤),然后在eclipse里import-->ExistingMavenProjects根据引导下一步直到完成;2). 然后右键上面两个项目名称下面的pom.xml(即一级工程下)Maven-->Update......
  • shell命令之expect报错
    一、运行shtest.sh报错test.sh:行7:spawn:未找到命令test.sh:行10:send:未找到命令test.sh:行11:interact:未找到命令原因:第一,你不该用sh,因为这是expect脚本,直接执行./e.sh或expect./e.sh第二,确认expect是在/usr/local/bin下参考:https://zhidao.baidu.com/question/7528840......
  • FreeNAS系统基本安装篇
    一、FreeNAS介绍:1.1介绍FreeNAS是一套免费的NAS服务器,它能将一部普通PC变成网络存储服务器。该软件基于FreeBSD,Samba及PHP,支持CIFS(samba),FTP,NFSprotocols,SoftwareRAID(0,1,5)及web界面的设定工具。用户可通过Windows、Macs、FTP、SSH及网络文件系统(NFS)来访......
  • spring报错-Caused by: java.lang.IllegalArgumentException: Unsupported class file
    这个错误原因是因为JDK版本过高,改一下版本就行了把里面的19改成8这样就行了......