2017-07-04 29 views
-1

我在分配一个季节时遇到访问冲突错误。我已经检查了i不乱bounds.The代码为打击:四元数分配本征失败

using Quaternionr = Eigen::Quaternion<double>; 
class A{ 
     std::vector<Quaternionr> m_lastQ; 
public: 
     EIGEN_MAKE_ALIGNED_OPERATOR_NEW 
inline void setLastQuaternion(const unsigned int i, const Quaternionr &pos) 
{ 
     m_lastQ[i] = pos; // access violation happends 
} 
}; 

的回调是如下:

POCosseratRods.exe!Eigen::internal::pload<__m128d>(const double * from) Line 307  
POCosseratRods.exe!Eigen::internal::ploadt<__m128d,16>(const double * from) Line 463  
POCosseratRods.exe!Eigen::internal::evaluator<Eigen::PlainObjectBase<Eigen::Matrix<double,4,1,0,4,1> > >::packet<16,__m128d>(int row, int col) Line 197 
POCosseratRods.exe!Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::assign_op<double,double>,0>::assignPacket<16,16,__m128d>(int row, int col) Line 652 
POCosseratRods.exe!Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::assign_op<double,double>,0>::assignPacketByOuterInner<16,16,__m128d>(int outer, int inner) Line 667 
POCosseratRods.exe!Eigen::internal::copy_using_evaluator_innervec_CompleteUnrolling<Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::assign_op<double,double>,0>,0,4>::run(Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::assign_op<double,double>,0> & kernel) Line 276  
POCosseratRods.exe!Eigen::internal::dense_assignment_loop<Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::assign_op<double,double>,0>,2,2>::run(Eigen::internal::generic_dense_assignment_kernel<Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::evaluator<Eigen::Matrix<double,4,1,0,4,1> >,Eigen::internal::assign_op<double,double>,0> & kernel) Line 468 
POCosseratRods.exe!Eigen::internal::call_dense_assignment_loop<Eigen::Matrix<double,4,1,0,4,1>,Eigen::Matrix<double,4,1,0,4,1>,Eigen::internal::assign_op<double,double> >(Eigen::Matrix<double,4,1,0,4,1> & dst, const Eigen::Matrix<double,4,1,0,4,1> & src, const Eigen::internal::assign_op<double,double> & func) Line 741 
POCosseratRods.exe!Eigen::internal::Assignment<Eigen::Matrix<double,4,1,0,4,1>,Eigen::Matrix<double,4,1,0,4,1>,Eigen::internal::assign_op<double,double>,Eigen::internal::Dense2Dense,void>::run(Eigen::Matrix<double,4,1,0,4,1> & dst, const Eigen::Matrix<double,4,1,0,4,1> & src, const Eigen::internal::assign_op<double,double> & func) Line 879 
POCosseratRods.exe!Eigen::internal::call_assignment_no_alias<Eigen::Matrix<double,4,1,0,4,1>,Eigen::Matrix<double,4,1,0,4,1>,Eigen::internal::assign_op<double,double> >(Eigen::Matrix<double,4,1,0,4,1> & dst, const Eigen::Matrix<double,4,1,0,4,1> & src, const Eigen::internal::assign_op<double,double> & func) Line 836 
POCosseratRods.exe!Eigen::internal::call_assignment<Eigen::Matrix<double,4,1,0,4,1>,Eigen::Matrix<double,4,1,0,4,1>,Eigen::internal::assign_op<double,double> >(Eigen::Matrix<double,4,1,0,4,1> & dst, const Eigen::Matrix<double,4,1,0,4,1> & src, const Eigen::internal::assign_op<double,double> & func, void * __formal) Line 804 
POCosseratRods.exe!Eigen::internal::call_assignment<Eigen::Matrix<double,4,1,0,4,1>,Eigen::Matrix<double,4,1,0,4,1> >(Eigen::Matrix<double,4,1,0,4,1> & dst, const Eigen::Matrix<double,4,1,0,4,1> & src) Line 782 
POCosseratRods.exe!Eigen::PlainObjectBase<Eigen::Matrix<double,4,1,0,4,1> >::_set<Eigen::Matrix<double,4,1,0,4,1> >(const Eigen::DenseBase<Eigen::Matrix<double,4,1,0,4,1> > & other) Line 710 
POCosseratRods.exe!Eigen::Matrix<double,4,1,0,4,1>::operator=(const Eigen::Matrix<double,4,1,0,4,1> & other) Line 209 
POCosseratRods.exe!Eigen::QuaternionBase<Eigen::Quaternion<double,0> >::operator=(const Eigen::QuaternionBase<Eigen::Quaternion<double,0> > & other) Line 486 
POCosseratRods.exe!OrientationData::setLastQuaternion(const unsigned int i, const Eigen::Quaternion<double,0> & pos) Line 407 
POCosseratRods.exe!TimeStepController::step(SimulationModel & model) Line 43  
POCosseratRods.exe!RodScene::update() Line 117 
POCosseratRods.exe!idlefunc() Line 40 
freeglutd.dll!0fd8dd9c() Unknown 
[Frames below may be incorrect and/or missing, no symbols loaded for freeglutd.dll] 
POCosseratRods.exe!main(int argc, char * * argv) Line 90  
[External Code] 

此错误意外happends。有时候,它不会发生。我不知道这是否与善意有关。
我在Windows 10上使用Visual Studion 2013,Eigen 3.3.4。

+0

什么是m_lastQ?如果它是一个STL容器,你是否尝试过使用'.at(i)'而不是'[i]'来确定是否出现越界访问?如果它是一个指针,你确定分配的内存足够大,这样第i个元素仍然属于它吗?四元数'pos'来自哪里? –

回答

0

这是STL容器的问题。 Here是解释。

要使用std :: vector和Eigen,需要一个对齐的分配器。

std::vector<Quaternionr,Eigen::aligned_allocator<Quaternionr>> m_lastQ;