Eigen static libaligned_free“双重释放或损坏”

2024-02-23

这是一个延续较早的帖子 https://stackoverflow.com/questions/70788173/eigen-static-lib-memory-align.

但这一次希望有一个更好的例子。设置向量时,这个简单的测试会崩溃。

我正在使用 Ubuntu 20.04、gcc 9.3.0、c++17、eigen 3.3.7

main.cpp

#include <iostream>
#include <memory>
#include "C.h"

using namespace std;

class B { 
public:
    C c;

    B() {
        cout << (uint64_t)this << endl;
    }
    ~B(){}

};

int main() {

    shared_ptr<B> b = make_shared<B>();

    b->c.v = VectorXd(5); // << crashes here
    // SIGABRT on `Eigen::internal::aligned_free` when trying to do `std::free()`

    return 0; 
}

C 类作为静态库链接。静态库以Release模式编译(--std=c++17 -DNDEBUG -O3),而主程序在调试中运行 - 没有优化。 如果静态库和主程序都以调试方式运行,则不会发生崩溃。 另外,如果它们都在 Release 中运行,则不会发生崩溃。仅当在Release中编译静态lib并且在Debug中编译主程序时,才会出现该问题。

C.h

#pragma once
#include <vector>
#include <Eigen/Core>

using namespace std;
using namespace Eigen;

class C {
public:

    VectorXd v;

    C();
    ~C();
};

C.cpp

#include "C.h"

C::C() {
    v = VectorXd(5);
}

C::~C() {

}

如果您编译的库和主要可执行文件具有不匹配的体系结构标志(-m...海湾合作委员会的标志 https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html),您可以观察崩溃情况。例如,当我编译启用 avx 的库时(-mavx)并且没有 avx 的主可执行文件,反之亦然,它会崩溃。该崩溃也发生在 Eigen 3.4.0 中。而且,在没有优化的情况下也会发生这种情况(-O0).

本征aligned_malloc() and aligned_free()函数根据值做不同的事情EIGEN_DEFAULT_ALIGN_BYTES宏,当例如启用或禁用 AVX(以及其他)。 Eigen 根据使用的编译器标志自动选择正确的值。因此,如果仅在静态库中启用 AVX,则C uses handmade_aligned_malloc()在内部,它不返回接收到的指针malloc()直接移动,但稍微移动一下以确保正确对齐。另一方面,为C::v来自可执行文件(没有 AVX 编译的)将首先尝试通过调用来释放内存b->c.v.~VectorXd(),然后最终调用free()代替handmade_aligned_free(). Thus, free()接收到一个不指向所分配内存开始的地址,这会导致崩溃。 当然,如果您在可执行文件中启用 AVX 并在库中禁用它,您会得到不匹配的调用malloc() and handmade_aligned_free()相反,也会导致崩溃。

解决方案很简单:确保使用相同的体系结构标志编译静态库和可执行文件。如果由于某种原因这是不可能的,请确保创建和销毁始终发生在同一组件中。例如,你可以使C::v私有并且只允许通过在中实现的函数对其进行修改C.cpp file.

注意:您的其他帖子 https://stackoverflow.com/q/70788173/3740047有点不同,因为它不涉及动态内存管理,而在当前的帖子中您使用VectorXd它确实使用动态内存管理。

注2:所描述的问题与使用无关std::shared_ptr。但对于 3.4.0 之前的 Eigen 版本,您可能需要使用EIGEN_MAKE_ALIGNED_OPERATOR_NEW以确保指针b无论架构和 C++17 如何,都正确对齐;至少是原来的特征问题 https://gitlab.com/libeigen/eigen/-/issues/1409仅针对 3.4.0 实施。但我在这一点上可能是错的。

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

Eigen static libaligned_free“双重释放或损坏” 的相关文章

  • 类型转换 sockaddr 结构

    我正在尝试学习网络编程 并在这个过程中学习C 我对结构感到困惑sockaddr这是一个通用地址 并且sockaddr in 我的书里是这么说的 因此 我们可以填写 sockaddr in 的字段 然后强制转换 a 指向 它指向 指向 soc
  • 如何查找boost运行时版本

    我正在编写一个使用 boost 的 C 库 在这个库中 我想包含有关用于编译我的库的二进制版本的 boost 版本的信息 我可以使用宏BOOST VERSION这很好 我还想确定哪个是 boost 的运行时版本 以便我可以与用于编译我的库的
  • 将数组从 C# 编组到 C++ 并返回:PInvokeStackImbalance

    我有一个 C 函数 我想从 C 访问它 问题是我不断收到 PInvokeStackImbalance 异常 但我不知道为什么 当检查异常被关闭时 一切都运行良好并且符合预期 我的 C 函数的签名是 extern C double solve
  • 无法使用 Unity 函数在 Visual Studio Code 中获得完整的 Intellisense

    好吧 我知道这个问题已经被问过并回答过很多次了 但我花了大约 3 天的时间试图解决这个问题 但到目前为止我所做的一切都没有奏效 我基本上在 Visual Studio Code 中有部分智能感知 也就是说 它似乎只识别 Unity 类和变量
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • 在 C 程序中追踪数组越界访问/写入的推荐方法

    考虑用 C 语言编写一些不太明显的算法的实现 例如 让它成为递归快速排序 我在 K N King 的 C 编程 现代方法 第二版 书中找到了它 可以从here http knking com books c2 programs qsort
  • 使用 C 创建立体声正弦波

    我正在尝试用 C 创建立体声正弦 WAV 并且可能有不同的 可能是空白的 左声道和右声道 使用此函数为每个通道生成一个音调 int16 t create tone float frequency float amplitude float
  • 是否可以用 C# 为 Android 编写应用程序?

    我们都知道Android运行Dalvik VM程序 通常开发人员用 Java 编写程序并将其编译为 Dalvik 字节码 我想知道是否有可能创建一个可以接受 C 代码并将其编译为 Dalvik 字节码的编译器 嗯 这是一种选择 或者您可以在
  • 使用经度和纬度查找给定距离内的所有附近客户

    我有一个包含客户经度和纬度的数据库 我有一个搜索表单 用户将在其中输入日志 纬度 距离下拉列表包含 50 英里 100 英里 当用户单击搜索时 我想编写一个 linq 查询从数据库中获取此距离半径内的所有客户 如何使用 C 和 linq 来
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • Xamarin 无法从异步获取实例

    我编写了一个通过蓝牙连接到 ESP32 的 Xamarin Forms 应用程序 现在我想从 MainPage xaml 页面的 CustomControl JoystickControl 获取值 我已经这样尝试过了 MainPage xa
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 允许 .NET WebApi 忽略 DOCTYPE 声明

    我正在尝试通过 WebApi 方法将 XML 反序列化为对象 我有以下课程 XmlRoot IsNullable false public class MyObject XmlElement Name public string Name
  • 如何带参数调用外部程序?

    我想在我的代码中调用一个 Windows 程序 并使用代码本身确定的参数 我不想调用外部函数或方法 而是调用 WinXP 环境中的实际 exe 或批处理 脚本文件 C 或 C 将是首选语言 但如果使用任何其他语言更容易完成此操作 请告诉我
  • 在同一条线上铸造两次

    我在项目中看到了这段代码 b的类型是void void b int a int unsigned long b 这条线毫无意义吗 我的意思是 这与a int b在所有情况下 这可能会避免 64 位 Unix 系统上的编译器警告unsigne
  • 什么是多重重继承?

    我将以下称为 多重重新继承 直接继承一个类一次 并通过继承其一个或多个后代来间接继承一次或多次 通过继承一个类的两个或多个后代来间接继承一个类两次或多次 我想知道它是否存在以及如何明确访问嵌入的子对象 1 Professional C 2n
  • 使用 LINQ to SQL 的 .NET 架构的最佳设计实践(DAL 必要吗?我们真的可以使用 POCO吗?要采用的设计模式吗?)

    我避免在 net arch n 层架构上编写看起来像是另一个线程的内容 但请耐心等待 希望我和其他人一样 在选择用于企业应用程序的架构时 考虑到当今的趋势和新兴技术 仍然没有 100 满意或不清楚应采取的最佳方法 我想我正在寻求大众社区对方
  • 使用 wmi 获取活动会话(Win32_LogonSession 还返回非活动/旧会话)

    有没有办法只显示 wmi 的活动会话 问题是 Win32 LogonSession 还显示不活动 断开连接的会话 ManagementScope scope new ManagementScope ManagementPath Defaul
  • 你将如何开始自动化我的工作? - 第2部分

    后续这个问题 https stackoverflow com questions 2796128 how would you start automating my job 在经历了第一波进货 9 小时的复制 粘贴 后 我现在相信我已经满足
  • C++20 范围太多 |运营商?

    我在这段代码中使用 g 10 2 有谁知道为什么我最后收到编译器错误std views reverse on results3 include

随机推荐

  • Atom 可以与 Python virtualenvwrapper 一起使用吗

    我想启动一个 Flask 应用程序 我安装了 virtualenvwrapper 来管理包 但我无法让 Atom 知道当前项目应该使用 virtualenv 的 python 二进制文件 from flask import Flask re
  • 如何保留同一个Android应用程序的两个版本?

    我们经常看到 Android 应用程序有两个版本 付费版本和免费版本 我还在开发一个想要发布两个版本的应用程序 做这个的最好方式是什么 在我看来 创建两个项目并在其间复制文件似乎不是最好的方法 Use 图书馆计划 http develope
  • Django 中的aggregate() 与 annotate()

    姜戈的QuerySet有两种方法 annotate and aggregate 文档说 与aggregate 不同 annotate 不是终止子句 annotate 子句的输出是一个查询集 https docs djangoproject
  • EVENTTARGET 确定发件人的问题

    我试图找出点击了哪个按钮 这段代码在 IE 中运行得很好 但如果我在 Chrome Firefox 或 Safari 中它不会执行任何操作 在 Firefox 中使用 firebug 时 我查看了表单详细信息 它显示 EVENTTARGET
  • 在 readthedocs 中构建随机失败

    Readthedocs 似乎有一个奇怪的问题 构建失败 没有任何明显的原因 在同一个提交 ID 上 构建一次失败 后来成功 Failure https readthedocs org projects opnfvdocsdemo build
  • 如何在独立的 Turbine 应用程序中激活 /turbine.stream 端点

    我正在尝试创建一个独立的应用程序来从其他应用程序收集 Hystrix 流 但它并没有暴露 turbine stream默认端点 我确信我的项目中缺少什么 Spring Boot 2 0 4 RELEASE Spring Cloud Finc
  • 有没有办法关闭 WebDriver 或 Protractor 中的选项卡?

    有没有办法通过 Protractor 或 WebDriver 物理关闭选项卡 我问是因为虽然我知道如何切换标签 https stackoverflow com questions 26798020 protractor switch to
  • 如何将多个图像上传到 Firebase Storage 并返回多个 downloadURL

    我们正在开发一个简单的电子商务应用程序 我们需要上传多个产品图片 使用 Vuejs 和 Vue Croppa 我们需要将图像上传到 firebase 存储 检索下载 URL 然后在将该产品添加到数据库时将这些 URL 包含在数组中
  • 使用从 ramda 中的原始属性派生的新属性来转换对象

    变换以下对象的最简单方法是什么 original name bob age 24 result name bob age 24 description bob is 24 years old 我可以使用 Lens 来更新单个属性 例如增加年
  • 如何在php中解密sha1?

    下面我使用 sha1 加密了一个字符串变量 现在我希望使用 sha1 函数解密数据 但我要去某个地方 请有人站出来以正确的方式指导我 下面是我的代码 我得到这样的输出 tiger 46e3d772a1888eadff26c7ada47fd7
  • 类型别名的范围是什么?

    Typescript 类型别名的范围是什么 我有这个别名 我想我可能想以某种方式在全球范围内声明它 type ResouceResult
  • 熊猫和 AWS Lambda

    有人有与 AWS Lambda 兼容的完全编译版本的 pandas 吗 搜索了几个小时后 我似乎找不到我要找的东西 而且关于这个主题的文档也不存在 我需要在 lambda 函数中访问该包 但是我未能成功地使该包正确编译以在 Lambda 函
  • 如何从 json 文件中删除 json 对象?

    我想从此 json 文件中删除年龄using org json or com googlecode json simple 假设这个 json 对象位于文件 test json 中 age 100 name mkyong com messa
  • 现代浏览器仍然限制并行下载吗?

    In 这篇雅虎文章 http yuiblog com blog 2007 04 11 performance research part 4 从 2007 年开始 作者认为静态资源应该分布在不同的主机名上 因为浏览器遵循 HTTP 1 1
  • 组件输入更改父级中传递的值

    据我了解 Input组件中的字段应该是单向的 父级到子级 但是 我有一个值要传递给Input然后在组件中修改它 但我注意到它在父级中也发生了变化 这对我来说是有道理的 因为对象是通过引用传递的 但我猜这意味着 Angular 设置的整个 单
  • 针对 Java 5 和 Java 6 的即时、内存中 Java 代码编译

    如何从 Java 5 和 Java 6 中的任意字符串 在内存中 编译 Java 代码 加载它并在其上运行特定方法 预定义 在你对此进行讨论之前 我查看了现有的实现 大多数依赖于 Java 6 编译器 API 那些不这样做的人 只能依靠技巧
  • Heroku:帐户无权访问应用程序

    我试图git pull heroku master 但我得到了 Your account email protected cdn cgi l email protection does not have access to app name
  • tailwindcss:强制 tailwind 使用兼容的 RGB 语法?

    我正在使用 tailwindcss 移植一个应用程序以与 IE11 一起使用 不幸的是 tailwindcss 坚持使用现代技术生成颜色W3C CSS 颜色模块级别 4 rgb https drafts csswg org css colo
  • 加载新键盘时从数字键盘上删除“完成”按钮

    好吧 我会尽力解释这一点 我有一个 iPhone 应用程序 它有一个文本字段 用户只能输入数字 那里不是问题 但是 数字键盘上没有完成按钮 所以我无法让它消失 我可以制作一个按钮 用户按下该按钮即可关闭键盘 但我宁愿有一个完成按钮 因为屏幕
  • Eigen static libaligned_free“双重释放或损坏”

    这是一个延续较早的帖子 https stackoverflow com questions 70788173 eigen static lib memory align 但这一次希望有一个更好的例子 设置向量时 这个简单的测试会崩溃 我正在