提升::p ython 和特征/密集创建分割错误
Boost::python and Eigen/dense create a segmentation fault
我想在这样的结构中使用特征/密集对象:
#include <boost/python.hpp>
#include <Eigen/Dense>
#include <iostream>
#include <vector>
struct data_t {
Eigen::Matrix2f matrix;
//std::vector<float> matrix;
};
data_t init_data() {
data_t result;
result.matrix(0, 0) = 1.0f;
result.matrix(0, 1) = 2.0f;
result.matrix(1, 0) = 3.0f;
result.matrix(1, 1) = 4.0f;
//result.matrix.push_back(1.0f);
//result.matrix.push_back(2.0f);
//result.matrix.push_back(3.0f);
//result.matrix.push_back(4.0f);
return result;
}
BOOST_PYTHON_MODULE(python_test) {
boost::python::class_<data_t>("DataType")
.def("from_init", &init_data)
.staticmethod("from_init")
;
}
python代码看起来像:
import python_test
def init_data():
return python_test.DataType.from_init()
sample = init_data()
执行会导致分段错误。我的问题是:为什么?如果我用 std::vector 替换 Eigen 对象,代码运行良好。
问题是data_t
包含一个 Eigen 期望对齐的矩阵,但 Boost::P ython 无法在对齐的内存上分配该矩阵。
最简单的解决方法是仅对此禁用对齐(如果您更频繁地使用它,请创建一个 typedef(:
struct data_t {
Eigen::Matrix<float, 2, 2, Eigen::DontAlign> matrix;
};
或者,通过编译-D EIGEN_MAX_STATIC_ALIGN_BYTES=0
(在最近的特征版本上(或-D EIGEN_DONT_ALIGN_STATICALLY
来禁用静态对齐(在较旧的特征版本中(。
实际上,如果 Boost::P ython 使用operator::new
来分配其对象,则以下内容也可能有效:
struct data_t {
Eigen::Matrix2f matrix;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
相关文章:
- C++使用params创建线程函数会导致转换错误
- 为什么加载SDF会导致Mobilizer创建闭环错误
- 此代码编译良好,但文件未创建?请指出错误
- 对象创建错误的C++矢量
- 如果用户输入的字符过多,则创建错误消息
- 本机库中的 OpenCV 创建错误
- #include "date.h" 创建错误 E1696 无法打开源文件"date.h",也无法打开包含文件:没有这样的文件或目录
- 使用makeword函数创建错误e0109-表观呼叫的括号前表达式必须具有(指针到 - )函数类型
- piThread在调用函数后创建错误
- CMAKE GCOV C 创建错误的.gcno文件
- 关于 C++ 中的头文件创建错误
- 窗口创建错误 - 可能是事件处理
- 氧气创建错误
- Xcode typedef 的 struct 创建错误/警告
- pthread 在分离的线程上创建错误 11
- 为什么代码创建错误的二进制搜索树
- 有人建议我的代码为什么在basic_ios和sstream中创建错误
- JNA -结构创建错误
- pthread在c++中创建错误
- 对象创建错误