класс c ++ с ошибкой сортировки и присваивания переменной-члена Eigen - PullRequest
0 голосов
/ 27 мая 2019

Мой краткий код, как показано ниже, у меня есть класс "PoseHypo":

class PoseHypo
{
public:
  PoseHypo();
  PoseHypo(const Eigen::Matrix4f &pose);
  PoseHypo& operator = (const PoseHypo &other); 
  ~PoseHypo();

public:
  Eigen::Matrix4f _pose;
  int _id;

  EIGEN_MAKE_ALIGNED_OPERATOR_NEW;
};

И теперь, когда я делаю следующее:

std::vector<PoseHypo> _pose_hypos;   // this is initialized somewhere before and I confirmed it is good 
std::sort(_pose_hypos.begin(),_pose_hypos.end(),HypoCompare()); // compare based on _id  

Это дает segfault.Вывод gdb:

#0  0x000000000057ee2b in _mm256_load_ps (__P=0x584b070)
    at /usr/lib/gcc/x86_64-linux-gnu/5/include/avxintrin.h:848
#1  Eigen::internal::pload<float __vector(8)>(Eigen::internal::unpacket_traits<float __vector(8)>::type const*) (
    from=0x584b070) at /usr/include/eigen3/Eigen/src/Core/arch/AVX/PacketMath.h:206
#2  0x00000000005d6420 in Eigen::internal::ploadt<float __vector(8), 32>(Eigen::internal::unpacket_traits<float __vector(8)>::type const*) (from=0x584b070) at /usr/include/eigen3/Eigen/src/Core/GenericPacketMath.h:475
#3  Eigen::internal::evaluator<Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> > >::packet<32, float __vector(8)>(long, long) const (this=0x7fffffff9a80, row=0, col=0)
    at /usr/include/eigen3/Eigen/src/Core/CoreEvaluators.h:183
#4  0x00000000005d31d6 in Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<float, 4, 4, 0, 4, 4> >, Eigen::internal::evaluator<Eigen::Matrix<float, 4, 4, 0, 4, 4> >, Eigen::internal::assign_op<float>, 0>::assignPacket<16, 32, float __vector(8)>(long, long) (this=0x7fffffff9a90, row=0, col=0)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:592
#5  0x00000000005d04a5 in Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<float, 4, 4, 0, 4, 4> >, Eigen::internal::evaluator<Eigen::Matrix<float, 4, 4, 0, 4, 4> >, Eigen::internal::assign_op<float>, 0>::assignPacketByOuterInner<16, 32, float __vector(8)>(long, long) (this=0x7fffffff9a90, outer=0, 
    inner=0) at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:606
#6  0x00000000005cc011 in Eigen::internal::copy_using_evaluator_innervec_CompleteUnrolling<Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<float, 4, 4, 0, 4, 4> >, Eigen::internal::evaluator<Eigen::Matrix<float, 4, 4, 0, 4, 4> >, Eigen::internal::assign_op<float>, 0>, 0, 16>::run (kernel=...)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:244
#7  0x00000000005c4ce6 in Eigen::internal::dense_assignment_loop<Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<float, 4, 4, 0, 4, 4> >, Eigen::internal::evaluator<Eigen::Matrix<float, 4, 4, 0, 4, 4> >, Eigen::internal::assign_op<float>, 0>, 3, 2>::run (kernel=...)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:403
#8  0x00000000005bf643 in Eigen::internal::call_dense_assignment_loop<Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::internal::assign_op<float> > (dst=..., src=..., func=...)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:653
#9  0x00000000005b88c7 in Eigen::internal::Assignment<Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::internal::assign_op<float>, Eigen::internal::Dense2Dense, float>::run (dst=..., src=..., 
--Type <RET> for more, q to quit, c to continue without paging--
    func=...) at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:790
#10 0x00000000005afe95 in Eigen::internal::call_assignment_no_alias<Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::internal::assign_op<float> > (dst=..., src=..., func=...)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:747
#11 0x00000000005b6f60 in Eigen::internal::call_assignment<Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::internal::assign_op<float> >(Eigen::Matrix<float, 4, 4, 0, 4, 4>&, Eigen::Matrix<float, 4, 4, 0, 4, 4> const&, Eigen::internal::assign_op<float> const&, Eigen::internal::enable_if<!Eigen::internal::evaluator_assume_aliasing<Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::internal::evaluator_traits<Eigen::Matrix<float, 4, 4, 0, 4, 4> >::Shape>::value, void*>::type) (dst=..., src=..., func=...)
    at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:712
#12 0x00000000005aeadc in Eigen::internal::call_assignment<Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::Matrix<float, 4, 4, 0, 4, 4> > (dst=..., src=...) at /usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h:693
#13 0x00000000005a327b in Eigen::PlainObjectBase<Eigen::Matrix<float, 4, 4, 0, 4, 4> >::_set<Eigen::Matrix<float, 4, 4, 0, 4, 4> > (this=0x584b010, other=...) at /usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:682
#14 0x0000000000594305 in Eigen::Matrix<float, 4, 4, 0, 4, 4>::operator= (this=0x584b010, other=...)
    at /usr/include/eigen3/Eigen/src/Core/Matrix.h:208
#15 0x00007ffff774b08d in PoseHypo::operator= (this=0x584b010, other=...)
..........

Есть некоторые другие отпечатки после # 15, и я могу добавить их при необходимости.Моя реализация для PoseHypo :: operator =:

PoseHypo& PoseHypo::operator = (const PoseHypo &other)
{
  _id=other._id;
  _pose=other._pose;
  return *this;
}

Я пробовал все виды ключевых слов в Google, но не смог найти никакой подсказки.Я думаю, что позаботился обо всех подводных камнях, упомянутых на сайте Eigen.Любая помощь с благодарностью !!

Подробнее о платформе:

Ubuntu 16.04
gcc-5.4
compile option c++11

1 Ответ

0 голосов
/ 18 июля 2019

Как подсказывает @ chtz

эта строка

std::vector<PoseHypo> _pose_hypos;  

необходимо изменить на

std::vector<PoseHypo,Eigen::aligned_allocator<PoseHypo> > _pose_hypos;

Несмотря на то, что это явно не собственный тип, он содержит Eigen :: Matrix4f внутри. Так что нам все еще нужен такой вид align_allocator.

...