cpp - valgrind - 大小为8的读取无效 [英] cpp - valgrind - Invalid read of size 8

查看:187
本文介绍了cpp - valgrind - 大小为8的读取无效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我越来越疯狂地理解valgrind错误。我有一个名为Matrix的模板类,它有一些重载的操作符等...做一些数学运算。 Matrixes在一个名为ExtendedKalmanFilter的类中使用。



这里是valgrind跟踪:

  == 3352 ==无效读取大小8 
== 3352 ==在0x804CC8F:BOViL :: math :: Matrix< double> :: operator *(BOViL :: math :: Matrix< double> const& :285)
== 3352 == by 0x8051F91:BOViL :: algorithms :: ExtendedKalmanFilter :: forecastStep(double)(ExtendedKalmanFilter.cpp:48)
== 3352 == by 0x8051F25:BOViL ::算法:: ExtendedKalmanFilter :: stepEKF(BOViL :: math :: Matrix< double> const& amp; double)(ExtendedKalmanFilter.cpp:39)
== 3352 == by 0x804B98F:testSegmentation()(TestSegmentation.cpp: 53)
== 3352 == by 0x805266D:main(main.cpp:16)
== 3352 ==地址0x6a8b3c0是大小为48的块后的0个字节alloc_d
= = 3352 == at 0x402B454:operator new [](unsigned int)(在/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so中)
== 3352 == by 0x804C986:BOViL :: math :: Matrix< double> :: operator =(BOViL :: math :: Matrix< double> const&)(Matrix.h:224)
== 3352 == by 0x8051C62:BOViL :: algorithms :: ExtendedKalmanFilter setUpEKF(BOViL :: math :: Matrix< double>,BOViL :: math :: Matrix< double>,BOViL :: math :: Matrix< double>)(ExtendedKalmanFilter.cpp:23)
== 3352 = = by 0x804B74F:testSegmentation()(TestSegmentation.cpp:37)
== 3352 == by 0x805266D:main(main.cpp:16)
== 3352 ==
== 3352 ==无效写入大小8
== 3352 ==在0x804CC12:BOViL :: math :: Matrix< double> :: operator *(BOViL :: math :: Matrix< double> const&)const(Matrix.h:283)
== 3352 == by 0x8051F91:BOViL :: algorithms :: ExtendedKalmanFilter :: forecastStep(double)(ExtendedKalmanFilter.cpp:48)
== 3352 == by 0x8051F25:BOViL :: algorithms :: ExtendedKalmanFilter :: stepEKF(BOViL :: math :: Matrix< double> const& amp; double)(ExtendedKalmanFilter.cpp:39)
== 3352 == by 0x804B98F: testSegmentation()(TestSegmentation.cpp:53)
== 3352 == by 0x805266D:main(main.cpp:16)
== 3352 ==地址0x6a8d210是一个大小为48的块alloc'd
== 3352 == at 0x402B454:operator new [](unsigned int)(in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
== 3352 == by 0x804CBD8:BOViL :: math :: Matrix< double> :: operator *(BOViL :: math :: Matrix< double> const&)const(Matrix.h:279)
== 3352 == by 0x8051F91: BOViL :: algorithms :: ExtendedKalmanFilter :: forecastStep(double)(ExtendedKalmanFilter.cpp:48)
== 3352 == by 0x8051F25:BOViL :: algorithms :: ExtendedKalmanFilter :: stepEKF(BOViL :: math :: Matrix< ; double> const& double;(ExtendedKalmanFilter.cpp:39)
== 3352 == by 0x804B98F:testSegmentation()(TestSegmentation.cpp:53)
== 3352 == by 0x805266D:main cpp:16)
== 3352 ==
== 3352 ==无效读取大小8
== 3352 == 0x804CC55:BOViL :: math :: Matrix< double> ;: :operator *(BOViL :: math :: Matrix< double> const&)const(Matrix.h:285)
== 3352 == by 0x8051F91:BOViL :: algorithms :: ExtendedKalmanFilter :: forecastStep (ExtendedKalmanFilter.cpp:48)
== 3352 == by 0x8051F25:BOViL :: algorithms :: ExtendedKalmanFilter :: stepEKF(BOViL :: math :: Matrix< double> const& amp; double)(ExtendedKalmanFilter.cpp: 39)
== 3352 == by 0x804B98F:testSegmentation()(TestSegmentation.cpp:53)
== 3352 == by 0x805266D:main(main.cpp:16)
== 3352 ==地址0x6a8d210是大小为48的块后面的0字节alloc_d
== 3352 == at 0x402B454:operator new [](unsigned int)(在/ usr / lib / valgrind / vgpreload_memcheck-x86- linux.so)
== 3352 == by 0x804CBD8:BOViL :: math :: Matrix< double> :: operator *(BOViL :: math :: Matrix< double> const&)const(Matrix.h:279)
== 3352 == by 0x8051F91:BOViL :: algorithms :: ExtendedKalmanFilter :: forecastStep(double)(ExtendedKalmanFilter.cpp:48)
== 3352 == by 0x8051F25:BOViL :: algorithms :: ExtendedKalmanFilter :: stepEKF(BOViL :: math :: Matrix< double> const& amp; double)(ExtendedKalmanFilter.cpp:39)
== 3352 == by 0x804B98F: testSegmentation()(TestSegmentation.cpp:53)
== 3352 == by 0x805266D:main(main.cpp:16)
== 3352 ==
== 3352 ==无效写size size 8
== 3352 == at 0x804CC95:BOViL :: math :: Matrix< double> :: operator *(BOViL :: math :: Matrix< double> const&)const(Matrix.h:285 )
== 3352 == by 0x8051F91:BOViL :: algorithms :: ExtendedKalmanFilter :: forecastStep(double)(ExtendedKalmanFilter.cpp:48)
== 3352 == by 0x8051F25:BOViL :: algorithms: :ExtendedKalmanFilter :: stepEKF(BOViL :: math :: Matrix< double> const& double)(ExtendedKalmanFilter.cpp:39)
== 3352 == by 0x804B98F:testSegmentation()(TestSegmentation.cpp:53)
== 3352 == by 0x805266D:main(main.cpp:16)
== 3352 ==地址0x6a8d210是一个大小为48的块后的0个字节alloc_d
== 3352 == at 0x402B454:operator new [](unsigned int)(在/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so中)
== 3352 == by 0x804CBD8:BOViL :: math :: Matrix< double> :: operator *(BOViL :: math :: Matrix< double> const&)const(Matrix.h:279)
== 3352 == by 0x8051F91:BOViL :: algorithms :: ExtendedKalmanFilter :: forecastStep(double)(ExtendedKalmanFilter.cpp:48)
== 3352 == by 0x8051F25:BOViL :: algorithms :: ExtendedKalmanFilter :: stepEKF(BOViL :: math :: Matrix< double> const& amp; double)(ExtendedKalmanFilter.cpp:39)
== 3352 == by 0x804B98F: testSegmentation()(TestSegmentation.cpp:53)
== 3352 == by 0x805266D:main(main.cpp:16)
== 3352 ==
--3352-- VALGRIND INTERNAL错误:Valgrind接收到信号11(SIGSEGV) - 退出
--3352-- si_code = 1;故障地址:0x6F666562; sp:0x6800fa88

valgrind:不可能发生:
致命信号致死
== 3352 == at 0x380C0AD4:? (在/ usr / lib / valgrind / memcheck-x86-linux)
== 3352 == by 0x380C12C5:? (在/ usr / lib / valgrind / memcheck-x86-linux)
== 3352 == by 0x38040A63:? (在/ usr / lib / valgrind / memcheck-x86-linux)
== 3352 == by 0x38040B36:? (在/ usr / lib / valgrind / memcheck-x86-linux)
== 3352 == by 0x3803EA4B:? (在/ usr / lib / valgrind / memcheck-x86-linux)
== 3352 == by 0x74206572:?

sched status:
running_tid = 1

线程1:status = VgTs_Runnable
== 3352 == at 0x402B454:operator new [] int)(在/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
== 3352 == by 0x804BD52:BOViL :: math :: Matrix< double> :: Matrix(double const *,int ,int)(Matrix.h:118)
== 3352 == by 0x804CCF3:BOViL :: math :: Matrix< double> :: operator *(BOViL :: math :: Matrix< double> const& const(Matrix.h:290)
== 3352 == by 0x8051F91:BOViL :: algorithms :: ExtendedKalmanFilter :: forecastStep(double)(ExtendedKalmanFilter.cpp:48)
== 3352 == by 0x8051F25:BOViL :: algorithms :: ExtendedKalmanFilter :: stepEKF(BOViL :: math :: Matrix< double> const& amp; double)(ExtendedKalmanFilter.cpp:39)
== 3352 == by 0x804B98F:testSegmentation (TestSegmentation.cpp:53)
== 3352 == by 0x805266D:main(main.cpp:16)


b $ b

这里代码片段:



- > Matrix接口

  template< typename type_> 
class Matrix {
public://主界面
Matrix(); //默认构造函数
Matrix(int _cols,int _rows); //空矩阵构造函数
Matrix(const type_ * _mat,int _rows,int _cols); //全定义矩阵构造函数
Matrix(const Matrix& _mat); //复制构造函数
Matrix(Matrix&& _mat); // Move constructor c ++ 11

〜Matrix(); //解构造函数

type_ * getMatrixPtr()const;
int getWidth()const;
int getHeight()const;

void showMatrix()const;

public://重载运算符
std :: string operator<<(const Matrix< type_>& _mat)const; // operator for cout 666 TODO:
type_& operator [](int _index);
Matrix operator =(const Matrix& _mat); // Assignement operator
矩阵运算符+(const Matrix& _mat)const; // Add operator
Matrix operator-(const Matrix& _mat)const; // Sub operator
矩阵运算符*(const Matrix& _mat)const; // Mul operator
矩阵运算符*(const type_ _scalar)const; // Scalar operator
矩阵运算符^(const double _exp)const; // Pow运算符666 TODO:

public://其他操作666 TODO:更改名称
矩阵运算符&(const Matrix& _mat)const; //投影operator._mat投影到这个
Matrix transpose(); // Transpose operator
type_ determinant(); //决定符运算符

public://各种算法
double norm();
bool decompositionLU(Matrix& _L,Matrix& _U);
bool decompositionCholesky(Matrix& _L,Matrix& _Lt);
bool decompositionLDL(Matrix& _L,Matrix& _D,Matrix& _Lt);
bool decompositionQR_GR(Matrix& _Q,Matrix& _R); //使用Householder反射算法的QR分解。

Matrix inverse(); //使用QR算法


private://私人接口
int mCols,mRows;
type_ * mPtr;

};

- >这里是矩阵崩溃:

  void ExtendedKalmanFilter :: forecastStep(const double _incT){
updateJf(_incT);

mXfk = mJf * mXak; << ----- HERE CRASH,运算符内部

mP = mJf * mP * mJf.transpose()+ mQ;
}

确切地说,它在构造函数矩阵内崩溃(type_ * ptr,int _cols,int _rows);同时初始化指针

  template< typename type_> 
Matrix< type_> Matrix< type_> :: operator *(const Matrix< type_>& _mat)const {
if(mCols!= _ mat.mRows)
assert

type_ * ptr = new type_ [mRows * _mat.mCols];

for(int i = 0; i for(int j = 0; j ptr [_mat.mCols * i + j] = 0;
for(int k = 0; k <_mat.mRows; k ++){
ptr [_mat.mCols * i + j] + = mPtr [mCols * i + k] * _mat。 mPtr [_mat.mCols * k + j];
}
}
}

Matrix< type_> mat(ptr,mRows,_mat.mCols); << ----- HERE
delete [] ptr;

return mat;
}


模板< typename type_>
Matrix< type_> :: Matrix(const type_ * _matPtr,int _rows,int _cols):mPtr(new type _ [_ cols * _rows]),
mCols(_cols),
mRows _rows)
{<<< ---- CRASH之前进入(所以我认为崩溃的新类型_ [_ cols * _rows]
for(int i = 0; i< _cols * _rows; i ++){
mPtr [i] = _matPtr [i];
}
}

最后,类的析构函数是:

  template< typename type_> 
Matrix< type_> ::〜Matrix(){
if(mPtr)
delete [] mPtr;
}
pre>

任何人都可以帮我吗?我不能找到麻烦我试图调试与Visual Studio在Windows和valgrind在Linux。



提前感谢

解决方案

您的第一个错误说:

  == 3352 ==无效读取大小8 
== 3352 == at 0x804CC8F:BOViL :: math :: Matrix< double> :: operator *(BOViL :: math :: Matrix< double> const&)const(Matrix.h:285)
== 3352 == by 0x8051F91:BOViL :: algorithms :: ExtendedKalmanFilter :: forecastStep(double)(ExtendedKalmanFilter.cpp:48)
== 3352 == by 0x8051F25:BOViL :: algorithms :: ExtendedKalmanFilter :: stepEKF(BOViL :: math :: Matrix< double> const& amp; double)(ExtendedKalmanFilter.cpp:39)
== 3352 == by 0x804B98F: testSegmentation()(TestSegmentation.cpp:53)
== 3352 == by 0x805266D:main(main.cpp:16)
== 3352 ==地址0x6a8b3c0是一个大小为48的块alloc'd
== 3352 == at 0x402B454:operator new [](unsigned int)(在/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so中)
== 3352 ==通过0x804C986:BOViL :: math :: Matrix< double> :: operator =(BOViL :: math :: Matrix< double> const&)(Matrix.h:224)
== 3352 == by 0x8051C62:BOViL :: algorithms :: ExtendedKalmanFilter :: setUpEKF(BOViL :: math :: Matrix< double>,BOViL :: math :: Matrix< double>,BOViL :: math :: Matrix< double>)(ExtendedKalmanFilter.cpp:23)
== 3352 == by 0x804B74F:testSegmentation()(TestSegmentation.cpp:37)
== 3352 == by 0x805266D:main(main.cpp:16)

这意味着:

  == 3352 ==无效读取大小8 
== 3352 ==在0x804CC8F:BOViL :: math :: Matrix< double> :: operator *(BOViL :: math :: Matrix< double> const&)const(Matrix.h:285)
== 3352 ==地址0x6a8b3c0是大小为48的块后的0个字节alloc $ d

知道你的矩阵是 double ,这意味着矩阵中的数组被分配为包含6个元素c $ c> 48 / sizeof double )。但是,你在块后访问0个字节,这意味着你正在访问元素索引6.



因此,有两件事需要验证:


  1. 6是否正确? c>> 的第285行,这可能在 for 循环,

      Matrix< type_ ; mat(ptr,mRows,_mat.mCols); << ----- HERE 

    你需要检查你给数组的索引。很可能,你会发现数组被索引为6,这是你应该找出为什么



I'm getting mad understanding that valgrind error. I've got a template class called Matrix that has some overloaded operators etc... to do some mathematical operations. Matrixes are used inside a class called ExtendedKalmanFilter.

Here is the valgrind trace:

==3352== Invalid read of size 8
==3352==    at 0x804CC8F: BOViL::math::Matrix<double>::operator*(BOViL::math::Matrix<double> const&) const (Matrix.h:285)
==3352==    by 0x8051F91: BOViL::algorithms::ExtendedKalmanFilter::forecastStep(double) (ExtendedKalmanFilter.cpp:48)
==3352==    by 0x8051F25: BOViL::algorithms::ExtendedKalmanFilter::stepEKF(BOViL::math::Matrix<double> const&, double) (ExtendedKalmanFilter.cpp:39)
==3352==    by 0x804B98F: testSegmentation() (TestSegmentation.cpp:53)
==3352==    by 0x805266D: main (main.cpp:16)
==3352==  Address 0x6a8b3c0 is 0 bytes after a block of size 48 alloc'd
==3352==    at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3352==    by 0x804C986: BOViL::math::Matrix<double>::operator=(BOViL::math::Matrix<double> const&) (Matrix.h:224)
==3352==    by 0x8051C62: BOViL::algorithms::ExtendedKalmanFilter::setUpEKF(BOViL::math::Matrix<double>, BOViL::math::Matrix<double>, BOViL::math::Matrix<double>) (ExtendedKalmanFilter.cpp:23)
==3352==    by 0x804B74F: testSegmentation() (TestSegmentation.cpp:37)
==3352==    by 0x805266D: main (main.cpp:16)
==3352== 
==3352== Invalid write of size 8
==3352==    at 0x804CC12: BOViL::math::Matrix<double>::operator*(BOViL::math::Matrix<double> const&) const (Matrix.h:283)
==3352==    by 0x8051F91: BOViL::algorithms::ExtendedKalmanFilter::forecastStep(double) (ExtendedKalmanFilter.cpp:48)
==3352==    by 0x8051F25: BOViL::algorithms::ExtendedKalmanFilter::stepEKF(BOViL::math::Matrix<double> const&, double) (ExtendedKalmanFilter.cpp:39)
==3352==    by 0x804B98F: testSegmentation() (TestSegmentation.cpp:53)
==3352==    by 0x805266D: main (main.cpp:16)
==3352==  Address 0x6a8d210 is 0 bytes after a block of size 48 alloc'd
==3352==    at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3352==    by 0x804CBD8: BOViL::math::Matrix<double>::operator*(BOViL::math::Matrix<double> const&) const (Matrix.h:279)
==3352==    by 0x8051F91: BOViL::algorithms::ExtendedKalmanFilter::forecastStep(double) (ExtendedKalmanFilter.cpp:48)
==3352==    by 0x8051F25: BOViL::algorithms::ExtendedKalmanFilter::stepEKF(BOViL::math::Matrix<double> const&, double) (ExtendedKalmanFilter.cpp:39)
==3352==    by 0x804B98F: testSegmentation() (TestSegmentation.cpp:53)
==3352==    by 0x805266D: main (main.cpp:16)
==3352== 
==3352== Invalid read of size 8
==3352==    at 0x804CC55: BOViL::math::Matrix<double>::operator*(BOViL::math::Matrix<double> const&) const (Matrix.h:285)
==3352==    by 0x8051F91: BOViL::algorithms::ExtendedKalmanFilter::forecastStep(double) (ExtendedKalmanFilter.cpp:48)
==3352==    by 0x8051F25: BOViL::algorithms::ExtendedKalmanFilter::stepEKF(BOViL::math::Matrix<double> const&, double) (ExtendedKalmanFilter.cpp:39)
==3352==    by 0x804B98F: testSegmentation() (TestSegmentation.cpp:53)
==3352==    by 0x805266D: main (main.cpp:16)
==3352==  Address 0x6a8d210 is 0 bytes after a block of size 48 alloc'd
==3352==    at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3352==    by 0x804CBD8: BOViL::math::Matrix<double>::operator*(BOViL::math::Matrix<double> const&) const (Matrix.h:279)
==3352==    by 0x8051F91: BOViL::algorithms::ExtendedKalmanFilter::forecastStep(double) (ExtendedKalmanFilter.cpp:48)
==3352==    by 0x8051F25: BOViL::algorithms::ExtendedKalmanFilter::stepEKF(BOViL::math::Matrix<double> const&, double) (ExtendedKalmanFilter.cpp:39)
==3352==    by 0x804B98F: testSegmentation() (TestSegmentation.cpp:53)
==3352==    by 0x805266D: main (main.cpp:16)
==3352== 
==3352== Invalid write of size 8
==3352==    at 0x804CC95: BOViL::math::Matrix<double>::operator*(BOViL::math::Matrix<double> const&) const (Matrix.h:285)
==3352==    by 0x8051F91: BOViL::algorithms::ExtendedKalmanFilter::forecastStep(double) (ExtendedKalmanFilter.cpp:48)
==3352==    by 0x8051F25: BOViL::algorithms::ExtendedKalmanFilter::stepEKF(BOViL::math::Matrix<double> const&, double) (ExtendedKalmanFilter.cpp:39)
==3352==    by 0x804B98F: testSegmentation() (TestSegmentation.cpp:53)
==3352==    by 0x805266D: main (main.cpp:16)
==3352==  Address 0x6a8d210 is 0 bytes after a block of size 48 alloc'd
==3352==    at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3352==    by 0x804CBD8: BOViL::math::Matrix<double>::operator*(BOViL::math::Matrix<double> const&) const (Matrix.h:279)
==3352==    by 0x8051F91: BOViL::algorithms::ExtendedKalmanFilter::forecastStep(double) (ExtendedKalmanFilter.cpp:48)
==3352==    by 0x8051F25: BOViL::algorithms::ExtendedKalmanFilter::stepEKF(BOViL::math::Matrix<double> const&, double) (ExtendedKalmanFilter.cpp:39)
==3352==    by 0x804B98F: testSegmentation() (TestSegmentation.cpp:53)
==3352==    by 0x805266D: main (main.cpp:16)
==3352== 
--3352-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting
--3352-- si_code=1;  Faulting address: 0x6F666562;  sp: 0x6800fa88

valgrind: the 'impossible' happened:
   Killed by fatal signal
==3352==    at 0x380C0AD4: ??? (in /usr/lib/valgrind/memcheck-x86-linux)
==3352==    by 0x380C12C5: ??? (in /usr/lib/valgrind/memcheck-x86-linux)
==3352==    by 0x38040A63: ??? (in /usr/lib/valgrind/memcheck-x86-linux)
==3352==    by 0x38040B36: ??? (in /usr/lib/valgrind/memcheck-x86-linux)
==3352==    by 0x3803EA4B: ??? (in /usr/lib/valgrind/memcheck-x86-linux)
==3352==    by 0x74206572: ???

sched status:
  running_tid=1

Thread 1: status = VgTs_Runnable
==3352==    at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3352==    by 0x804BD52: BOViL::math::Matrix<double>::Matrix(double const*, int, int) (Matrix.h:118)
==3352==    by 0x804CCF3: BOViL::math::Matrix<double>::operator*(BOViL::math::Matrix<double> const&) const (Matrix.h:290)
==3352==    by 0x8051F91: BOViL::algorithms::ExtendedKalmanFilter::forecastStep(double) (ExtendedKalmanFilter.cpp:48)
==3352==    by 0x8051F25: BOViL::algorithms::ExtendedKalmanFilter::stepEKF(BOViL::math::Matrix<double> const&, double) (ExtendedKalmanFilter.cpp:39)
==3352==    by 0x804B98F: testSegmentation() (TestSegmentation.cpp:53)
==3352==    by 0x805266D: main (main.cpp:16)

And here fragments of the code:

--> Matrix interface

    template <typename type_> 
    class Matrix{
    public:     // Main interface
        Matrix();       // Default constructor
        Matrix(int _cols, int _rows);       // Empty matrix constructor
        Matrix(const type_* _mat, int _rows, int _cols);    // Full-defined matrix constructor
        Matrix(const Matrix& _mat);     // Copy constructor
        Matrix(Matrix&& _mat);          // Move constructor c++11

        ~Matrix();      // De-constructor

        type_* getMatrixPtr() const;
        int getWidth() const;
        int getHeight() const;

        void showMatrix() const;

   public:  // Overloaded Operators
        std::string operator<<(const Matrix<type_>& _mat) const;        // Operator for cout 666 TODO:
        type_& operator[](int _index);
        Matrix operator=(const Matrix& _mat);               // Assignement operator
        Matrix operator+(const Matrix& _mat) const;     // Add operator
        Matrix operator-(const Matrix& _mat) const;     // Sub operator
        Matrix operator*(const Matrix& _mat) const;     // Mul operator
        Matrix operator*(const type_ _scalar) const;        // Scalar operator
        Matrix operator^(const double _exp) const;      // Pow operator     666 TODO:

    public: // Other operations 666 TODO: Change names
        Matrix operator&(const Matrix& _mat) const;     // Projection operator._mat is projected to this
        Matrix transpose();                             // Transpose operator
        type_ determinant();                            // Determinant operator

    public:     // Various algorithms
        double norm();
        bool decompositionLU(Matrix& _L, Matrix& _U);
        bool decompositionCholesky(Matrix& _L, Matrix& _Lt);
        bool decompositionLDL(Matrix& _L, Matrix& _D, Matrix& _Lt);
        bool decompositionQR_GR(Matrix& _Q, Matrix& _R);        // QR decomposition using Householder reflexions algorithm.

        Matrix inverse();       // Using QR algorithm


    private:    // Private interface
        int mCols, mRows;
        type_* mPtr;

    };

-->And here is where matrix crash:

void ExtendedKalmanFilter::forecastStep(const double _incT){
    updateJf(_incT);

    mXfk = mJf * mXak;  <<<----- HERE CRASH, inside operator*

    mP = mJf * mP * mJf.transpose() + mQ;
}

To be precise, it crash inside the constructor matrix(type_* ptr, int _cols, int _rows); while initializing the pointer

template<typename type_> 
Matrix<type_> Matrix<type_>::operator* (const Matrix<type_>& _mat) const{
    if(mCols !=_mat.mRows)
        assert(false);

    type_* ptr = new type_[mRows*_mat.mCols];

    for(int i = 0; i < mRows ; i ++ ){
        for(int j = 0 ; j < mCols ; j ++){
            ptr[_mat.mCols * i + j] = 0;
            for(int k = 0 ; k < _mat.mRows ; k ++){
                ptr[_mat.mCols * i + j] += mPtr[mCols * i + k] * _mat.mPtr[_mat.mCols * k + j];
            }
        }
    }

    Matrix<type_> mat(ptr, mRows, _mat.mCols); <<< ----- HERE
    delete[] ptr;

    return mat;
}


template<typename type_> 
Matrix<type_>::Matrix(const type_* _matPtr, int _rows, int _cols):  mPtr(new type_[_cols*_rows]),
                                                                        mCols(_cols),
                                                                        mRows(_rows)        
    { <<<---- CRASH before getting into (So I suppose that crash in the new type_[_cols*_rows]
        for(int i = 0; i < _cols*_rows ; i ++){
            mPtr[i] = _matPtr[i];
        }
    }

Finally, the destructor of the class is:

template<typename type_> 
Matrix<type_>::~Matrix(){
    if(mPtr)
        delete[] mPtr;
}

Can anyone help me? I cant find the trouble I tryed debugging with Visual Studio in windows and with valgrind in linux.

Thanks in advance

解决方案

Your first error says:

==3352== Invalid read of size 8
==3352==    at 0x804CC8F: BOViL::math::Matrix<double>::operator*(BOViL::math::Matrix<double> const&) const (Matrix.h:285)
==3352==    by 0x8051F91: BOViL::algorithms::ExtendedKalmanFilter::forecastStep(double) (ExtendedKalmanFilter.cpp:48)
==3352==    by 0x8051F25: BOViL::algorithms::ExtendedKalmanFilter::stepEKF(BOViL::math::Matrix<double> const&, double) (ExtendedKalmanFilter.cpp:39)
==3352==    by 0x804B98F: testSegmentation() (TestSegmentation.cpp:53)
==3352==    by 0x805266D: main (main.cpp:16)
==3352==  Address 0x6a8b3c0 is 0 bytes after a block of size 48 alloc'd
==3352==    at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==3352==    by 0x804C986: BOViL::math::Matrix<double>::operator=(BOViL::math::Matrix<double> const&) (Matrix.h:224)
==3352==    by 0x8051C62: BOViL::algorithms::ExtendedKalmanFilter::setUpEKF(BOViL::math::Matrix<double>, BOViL::math::Matrix<double>, BOViL::math::Matrix<double>) (ExtendedKalmanFilter.cpp:23)
==3352==    by 0x804B74F: testSegmentation() (TestSegmentation.cpp:37)
==3352==    by 0x805266D: main (main.cpp:16)

which in short means:

==3352== Invalid read of size 8
==3352==    at 0x804CC8F: BOViL::math::Matrix<double>::operator*(BOViL::math::Matrix<double> const&) const (Matrix.h:285)
==3352==  Address 0x6a8b3c0 is 0 bytes after a block of size 48 alloc'd

Knowing that your matrix is of double, that means the array inside the matrix is allocated to contain 6 elements (48/sizeof double). However, you are accessing 0 bytes after the block, which means you are accessing exactly element index 6.

So there are two things that you need to verify:

  1. Is 6 correct? Should the array contain 6 elements?
  2. At line 285 of Matrix.h, which is likely inside the for loops, not here:

    Matrix<type_> mat(ptr, mRows, _mat.mCols); <<< ----- HERE
    

    you need to examine what indices you are giving to the array. Likely, you will find the array being indexed at 6 and that's where you should figure out why.

这篇关于cpp - valgrind - 大小为8的读取无效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆