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 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 按成员序列化

    我已经实现了template
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • 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