Eigen 3.3.4 Fedora 27内存对齐经常失败

时间:2018-03-13 22:35:22

标签: eigen memory-alignment eigen3

Eigen 3.3.4内存对齐在我的程序中失败但以前用过。 特别是某些结构会创建无效的免费并将我重定向到this page,即使该类本身已具有宏EIGEN_MAKE_ALIGNED_OPERATOR_NEW

这在多个项目中重复发生。

例如,这是崩溃后的Valgrind日志:

==7191== Thread 1:
==7191== Invalid free() / delete / delete[] / realloc()
==7191==    at 0x4C30D18: free (vg_replace_malloc.c:530)
==7191==    by 0x785419: perception_oru::NDTMap::NDTMap(perception_oru::SpatialIndex*, float, float, float, float, float, float, bool) (ndt_map.h:166)
==7191==    by 0x54A11B8: perception_oru::libgraphMap::NDTMapType::NDTMapType(boost::shared_ptr<perception_oru::libgraphMap::MapParam>) (ndt_map_type.cpp:14)
==7191==    by 0x54CC105: perception_oru::libgraphMap::GraphFactory::CreateMapType(boost::shared_ptr<perception_oru::libgraphMap::MapParam>) (graphfactory.cpp:53)
==7191==    by 0x54172E3: perception_oru::libgraphMap::MapNode::MapNode(Eigen::Transform<double, 3, 2, 0> const&, boost::shared_ptr<perception_oru::libgraphMap::MapParam> const&) (map_node.cpp:44)
==7191==    by 0x54CC6C7: perception_oru::libgraphMap::GraphFactory::CreateMapNode(Eigen::Transform<double, 3, 2, 0> const&, boost::shared_ptr<perception_oru::libgraphMap::MapParam> const&) (graphfactory.cpp:99)
==7191==    by 0x53D1D3F: perception_oru::libgraphMap::GraphMap::GraphMap(Eigen::Transform<double, 3, 2, 0> const&, boost::shared_ptr<perception_oru::libgraphMap::MapParam> const&, boost::shared_ptr<perception_oru::libgraphMap::GraphParam>) (graph_map.cpp:10)
==7191==    by 0x53E4DD4: perception_oru::libgraphMap::GraphMapNavigator::GraphMapNavigator(Eigen::Transform<double, 3, 2, 0> const&, boost::shared_ptr<perception_oru::libgraphMap::MapParam> const&, boost::shared_ptr<perception_oru::libgraphMap::GraphParam>) (graph_map_navigator.cpp:6)
==7191==    by 0x54CC534: perception_oru::libgraphMap::GraphFactory::CreateGraphNavigator(Eigen::Transform<double, 3, 2, 0> const&, boost::shared_ptr<perception_oru::libgraphMap::MapParam>&, boost::shared_ptr<perception_oru::libgraphMap::GraphParam>) (graphfactory.cpp:85)
==7191==    by 0x541E6AA: perception_oru::libgraphMap::GraphMapFuser::GraphMapFuser(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, Eigen::Transform<double, 3, 2, 0> const&, Eigen::Transform<double, 3, 2, 0> const&) (graph_map_fuser.cpp:16)
==7191==    by 0x78D046: GraphMapFuserNode::GraphMapFuserNode(ros::NodeHandle) (graph_map_publisher_localization.cpp:377)
==7191==    by 0x77F016: main (graph_map_publisher_localization.cpp:1267)
==7191==  Address 0x41e78a40 is 32 bytes inside a block of size 512 alloc'd
==7191==    at 0x4C2FB6B: malloc (vg_replace_malloc.c:299)
==7191==    by 0x781175: Eigen::internal::handmade_aligned_malloc(unsigned long) (Memory.h:88)
==7191==    by 0x7811F9: Eigen::internal::aligned_malloc(unsigned long) (Memory.h:164)
==7191==    by 0x796223: void* Eigen::internal::conditional_aligned_malloc<true>(unsigned long) (Memory.h:214)
==7191==    by 0x784F25: perception_oru::NDTCell::operator new(unsigned long) (ndt_cell.h:518)
==7191==    by 0x7853C6: perception_oru::NDTMap::NDTMap(perception_oru::SpatialIndex*, float, float, float, float, float, float, bool) (ndt_map.h:164)
==7191==    by 0x54A11B8: perception_oru::libgraphMap::NDTMapType::NDTMapType(boost::shared_ptr<perception_oru::libgraphMap::MapParam>) (ndt_map_type.cpp:14)
==7191==    by 0x54CC105: perception_oru::libgraphMap::GraphFactory::CreateMapType(boost::shared_ptr<perception_oru::libgraphMap::MapParam>) (graphfactory.cpp:53)
==7191==    by 0x54172E3: perception_oru::libgraphMap::MapNode::MapNode(Eigen::Transform<double, 3, 2, 0> const&, boost::shared_ptr<perception_oru::libgraphMap::MapParam> const&) (map_node.cpp:44)
==7191==    by 0x54CC6C7: perception_oru::libgraphMap::GraphFactory::CreateMapNode(Eigen::Transform<double, 3, 2, 0> const&, boost::shared_ptr<perception_oru::libgraphMap::MapParam> const&) (graphfactory.cpp:99)
==7191==    by 0x53D1D3F: perception_oru::libgraphMap::GraphMap::GraphMap(Eigen::Transform<double, 3, 2, 0> const&, boost::shared_ptr<perception_oru::libgraphMap::MapParam> const&, boost::shared_ptr<perception_oru::libgraphMap::GraphParam>) (graph_map.cpp:10)
==7191==    by 0x53E4DD4: perception_oru::libgraphMap::GraphMapNavigator::GraphMapNavigator(Eigen::Transform<double, 3, 2, 0> const&, boost::shared_ptr<perception_oru::libgraphMap::MapParam> const&, boost::shared_ptr<perception_oru::libgraphMap::GraphParam>) (graph_map_navigator.cpp:6)
==7191== 

报告崩溃的代码是:

NDTCell *ptCell = new NDTCell();
index_->setCellType(ptCell);
delete ptCell;

虽然NDTCell类具有固定大小的特征成员,但它的代码的公共部分也有EIGEN_MAKE_ALIGNED_OPERATOR_NEW。现在这是一个很长的镜头但是,包含崩溃发生的类的类是这样创建的:

boost::shared_ptr<MapType>(new NDTMapType(ndt2MapParam));

我不明白为什么以前工作的代码会崩溃,而我却不知道为什么Eigen不能使用我的代码以及我做错了什么。

0 个答案:

没有答案