函数完成后,为什么矢量会导致free()错误?

时间:2019-04-20 04:18:04

标签: c++ vector free

我写了一些代码来计算逆动力学。似乎函数IverseDynamicscalculation已完成并返回true。然后发生错误:free():下一个大小(快速)无效:我知道这个问题有一些可能的答案,但我的答案全都不是。

这是通过ros插件在ubuntu 16.04和Qt4.8.0中运行的。

    class MyRobotSolver
    {
    public:
        MyRobotSolver();
        ~MyRobotSolver();
        void GetLengthofPlannedData();//get the length of the planned data;
        void model_initialization();//initialization of a model;
        bool IDynamicsCalculation();//Calculate the torque by inverse dynamics.
        const Model& getModel();
        const MatrixNd& getTau();
        const MatrixNd& getQPlanned();
        const MatrixNd& getQDotPlanned();
        void FDynamicsCalculation();//Calculate the forward dynamic with PD controller
        void FileStoreIntoTextFile(const char *filestoredlocation, const MatrixNd & Stored_data);


    private:
        unsigned int length_of_data;
        MatrixNd QPlanned, QDotPlanned, QDDotPlanned;
        MatrixNd TauofIDynamics;    
        MatrixNd QAcutal, QDotAcutal, QDDotAcutal;
        Model QuadrupedRobotModel;
        double Time_derta;
        VectorNd VecQAct, VecQDotAct, VecQDDotAct, VecTauAct;
        VectorNd VecTauerror, VecQerror, VecQDoterror;
};

然后我初始化参数:

    MyRobotSolver::MyRobotSolver()
      : length_of_data(10001),Time_derta(0.001)
    {

      QPlanned.resize(length_of_data,3);
      QDotPlanned.resize(length_of_data,3);
      QDDotPlanned.resize(length_of_data,3);
      QAcutal.resize(length_of_data,3);
      QDotAcutal.resize(length_of_data,3);
      QDDotAcutal.resize(length_of_data,3);
      TauofIDynamics.resize(length_of_data,3);

      VecTauerror.resize(3);
      VecQerror.resize(3);
      VecQDoterror.resize(3);
      VecQDDotAct.resize(3);
      VecQAct.resize(3);
      VecQDotAct.resize(3);
      VecQDDotAct.resize(3);
      model_initialization();
    }

然后我使用InveseDynamicscalculation来计算某些内容:

    bool MyRobotSolver::IDynamicsCalculation()
    {
        VectorNd VecQ, VecQDot, VecQDDot;
        VectorNd VecTau;
        VecTau.resize(3);
        VecQ.resize(3);
        VecTau = Vector3d::Zero(3);//Initialize the VecTau;
        VecQDot.resize(3);
        VecQDDot.resize(3);
        for (unsigned int i = 0; i < length_of_data; i++)
        {
            VecQ = QPlanned.row(i).transpose();
            VecQDot = QDotPlanned.row(i).transpose();
            VecQDDot = QDDotPlanned.row(i).transpose();
            InverseDynamics(QuadrupedRobotModel, VecQ,VecQDot,VecQDDot,VecTau);
            TauofIDynamics.row(i) = VecTau.transpose();
        }
        cout <<"finish the Inverse Dynamics calculation" << endl;
        return true;
    }
  1. 返回后发生此错误。似乎是由于释放了VecTau的内存造成的。以下三张图片显示了调试过程:Step1, execute return true Step2, jump to Vectau Step3, error occurs

但是,如果我将Vectau放在public类中,则当主函数返回时也会发生相同的错误。并且此功能可以很好地工作。 Step1, execute return true Step2, Jump to VecQ VecQ之后没有错误,然后跳转以再次返回true。

  1. 如果我将VecTau放入公共类,则VecQ,VecQDot和VecQDDot不会导致此错误。 VecTau和VecQ,VecQDot,VecQDDot之间的差异在于InverseDynamics的使用。此函数来自库: https://rbdl.bitbucket.io/d6/d63/group__dynamics__group.html#ga370188f52ca9e7f933f90a03adf5fa1e VecQ,VecQDot,VecQDDot是常量&,而VecTau只是&。所以我想知道原因。

0 个答案:

没有答案