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“双重释放或损坏” 的相关文章

随机推荐

  • 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 但这一次希望有一个更好的例子 设置向量时 这个简单的测试会崩溃 我正在