g2o运行时出现段错误segmentation fault

2023-11-17

问题描述

在Ubuntu 18.04上跑orbslam2程序,能够顺利运行orbslam2源码,但在自己新增了一段g2o优化的代码后,运行时出现段错误。错误触发于执行优化时:

optimizer.initializeOptimization();
optimizer.optimize(20);

当注释掉这段后,不报段错误了,开始报错“double free or corruption (out)”。

分析

网上大多数g2o段错误的帖子说是编译时--march=native的设置问题,但我源码的g2o跑得好好的。问题在自己新写的代码上,是朴素的段错误问题,自己写的代码没搞好内存管理。
使用sanitizer运行时动态检查:对g2o和orbslam2的CMakeLists.txt分别添加设置-fsanitize=address -g。再编译、运行,果然报错,提供了有意义的信息:

==8317==ERROR: AddressSanitizer: heap-use-after-free on address 0x613000643070 at pc 0x7f7e1a42ec4f bp 0x7f7dedb5a6a0 sp 0x7f7dedb5a690
READ of size 8 at 0x613000643070 thread T1
...
#4 0x7f7e1a461d29 in g2o::OptimizableGraph::addEdge(g2o::HyperGraph::Edge*) xxx/ORB_SLAM2-master/Thirdparty/g2o/g2o/core/optimizable_graph.cpp:270
#5 0x7f7e1d6b212b in ORB_SLAM2::Optimizer::hongzhilu_optimize_poseonly(ORB_SLAM2::Map*, unsigned long, unsigned long, bool const&) xxx/ORB_SLAM2-master/src/Optimizer.cc:1335
...
0x6130004eee90 is located 208 bytes inside of 384-byte region [0x6130004eedc0,0x6130004eef40)
freed by thread T1 here:
...
#4 0x7f7e1d6b894c in std::_Sp_counted_ptr_inplace<g2o::VertexSim3Expmap, std::allocator<g2o::VertexSim3Expmap>, (__gnu_cxx::_Lock_policy)2>::_M_destroy() /usr/include/c++/7/bits/shared_ptr_base.h:543
...
previously allocated by thread T1 here:
...
#8 0x7f7e1d6af28f in std::shared_ptr<g2o::VertexSim3Expmap> std::make_shared<g2o::VertexSim3Expmap>() /usr/include/c++/7/bits/shared_ptr.h:707
#9 0x7f7e1d6af28f in ORB_SLAM2::Optimizer::hongzhilu_optimize_poseonly(ORB_SLAM2::Map*, unsigned long, unsigned long, bool const&) xxx/ORB_SLAM2-master/src/Optimizer.cc:1281
...

自己新写的函数里,节点智能指针的空间申请和释放,将边加入优化器时读取……

结论

学艺不精,自作聪明地把源码中动态构造节点的普通指针g2o::VertexSim3Expmap* VSim3改写成智能指针std::shared_ptr<g2o::VertexSim3Expmap> VSim3,导致代码块退出时节点内存跟着智能指针一同释放,而节点在被释放前加入了优化器,后面发生了对节点已释放内存的访问。
改回普通指针,问题就解决了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

g2o运行时出现段错误segmentation fault 的相关文章

随机推荐

  • Vscode中JS输出乱码问题的解决

    一直很好用vscode突然不好用了 原来输出正常的JS代码在输出中都是乱码 于是上网查答案 试了很多奇奇怪怪的答案 然而没有一款能够解决我这个问题 仔细琢磨 既然以前好用 现在不好用 应该是某个电脑操作 误伤 友军 VScode执行代码原理
  • 五、Linux系统中的用户管理

    五 Linux系统中的用户管理 5 1 用户及用户组存在的意义 5 1 1 用户存在的意义 系统资源是有限的 如何合理分配系统资源 在这个问题解决时必须要有连个资源配合 1 身份 account 2 授权author 3 认证auth 3A
  • JS算法--整数反转

    1 需求介绍 给出一个 32 位的有符号整数 需要将这个整数中每位上的数字进行反转 注意 假设我们的环境只能存储得下 32 位的有符号整数 则其数值范围为 231 231 1 请根据这个假设 如果反转后整数溢出那么就返回 0 反转什么鬼 举
  • matlab 生成不重复的随机整数 打乱数据排列 生成深度学习数据集

    Matlab自带函数randperm n 可以产生1到n的整数的无重复的随机排列 利用它就可以得到无重复的随机数 例如 randperm n 产生一个1到n的随机顺序 gt gt randperm 10 ans 6 4 8 9 3 5 7
  • 人脸识别正则化系列之normface

    今天介绍一下NormFace L2 Hypersphere Embedding for Face Verification Motivation 希望利用正则化解决两个问题 1 人脸识别任务里面的loss有softmax contrasti
  • 【四】3D Object Model之创建Creation——read_object_model_3d()算子

    欢迎来到本博客 Halcon算子太多 学习查找都没有系统的学习查找路径 本专栏主要分享Halcon各类算子含义及用法 有时间会更新具体案例 具体食用方式 可以点击本专栏 Halcon算子快速查找 gt 搜索你要查询的算子名称 或者点击Hal
  • 9 款值得您花钱的最佳 PDF 编辑器

    PDF 格式在 90 年代初一推出就开始流行 PDF 文件便于携带 易于共享 阅读有趣 但难以编辑 有什么不喜欢的呢 与其他格式相比 无论大小的企业都更喜欢 PDF 因为他们不喜欢其他人篡改他们的文档 无论是指南 职业道德还是展示新产品功能
  • MySQL数据库基础操作—DML

    文章目录 DML的基本介绍 1 1数据插入 1 2数据修改 1 3 数据删除 注意 DML的基本介绍 DML是指数据库操作语言 全称是Data Manipulate Language 作用是对数据库中表的数据记录进行更新 关键字 插入ins
  • 区块链技术的主要特征有哪些

    区块链技术的主要特征有 1 去中心化 2 开放性 3 独立性 4 安全性 5 匿名性 从本质上讲 区块链是一个共享数据库 存储于其中的数据或信息 具有不可伪造 全程留痕 公开透明和集体维护等特征 区块链技术的特征 去中心化 区块链技术不依赖
  • Element ui中menu组件(el-menu/el-menu-item/el-submenu/template) 层级结构和用法

    此篇文章写下的时间是2020年 所以如今Element UI都更新了不知道多少版了 肯定会有些许变化 请勿完全照搬照抄 虽然可能这部分代码没什么大的变动 但还是要以官方文档为准 此文仅仅是借鉴 理解具体思路 然后再按照官方的例子来应用到自己
  • 软件工程——第7章实现知识点整理

    本专栏是博主个人笔记 主要目的是利用碎片化的时间来记忆软工知识点 特此声明 文章目录 1 实现由哪两个部分组成
  • C语言:动态内存(一篇拿捏动态内存!)

    目录 学习目标 为什么存在动态内存分配 动态内存函数 1 malloc 和 free 2 calloc 3 realloc 常见的动态内存错误 1 对NULL指针的解引用操作 2 对动态开辟空间的越界访问 3 对非动态开辟内存使用free释
  • 【ELK】kibana的Saved Objects导入脚本

    快速导入命令 curl XPOST http 192 168 1 1 5601 api kibana dashboards import H Content Type application json H kbn xsrf reportin
  • pip安装软件包报错: error subprocess-exited-with-error问题记录

    问题修复 执行pip install dlib 在执行pip3 install virtualenvwrapper也会报同样的错误 问题修复 我们需要执行如下命令 pip install upgrade setuptools pip ins
  • Maven 项目模板学习

    目录 Maven 项目模板 什么是 archetype 使用项目模板 Maven 将询问原型的版本 创建的项目 创建 pom xml Maven 项目文档 Maven 快照 SNAPSHOT 什么是快照 项目快照 vs 版本 app ui
  • Markdown常用语法记录

    Markdown 语法整理汇总 加粗斜体 加粗 符号 加粗 如 加粗 斜体 符号 斜体 如 斜体 斜体 粗体 符号 斜体 粗体 如 斜体 加粗体 目录 目录 符号 toc 标题 标题 符号 标题内容 几个 代表几级标题 列表 有序列表 符号
  • JavaScript-中的转义字符,\ 反斜杠的使用,如何同时使用多对单引号或双引号

    JS中的转义字符是反斜杠 常用的转义字符有 n r t 等 在 JS 代码中 成对的单引号 不能多对同时使用 双引号也是 如果同时使用多对单引号或双引号就会报错 提示有意外的字符 变量的值使用了多对单引号 原本是想让 单引号 三个字显示带有
  • TensorFlow学习(3)初始化&非饱和激活函数&批量归一化&梯度剪裁&迁移学习&优化器

    1 初始化 默认情况下使用Glorot初始化 1 1 使用其他初始化 1 lecun kernel initializer lecun normal 2 he初始化 kernel initializer he normal 2 非饱和激活函
  • 如何简单实现可执行文件的自我删除

    可执行文件即 EXE 文件在运行过程中 由系统管理其打开的句柄 此时对该文件的一些操作是被系统禁止的 比如删除操作 然而在某些场合 可能须要程序有自我删除的功能 也就是程序运行结束后删除自身 基于这个想法 可以有一种很简单的方法来实现这个基
  • g2o运行时出现段错误segmentation fault

    问题描述 在Ubuntu 18 04上跑orbslam2程序 能够顺利运行orbslam2源码 但在自己新增了一段g2o优化的代码后 运行时出现段错误 错误触发于执行优化时 optimizer initializeOptimization