Я использую qt creator для отладки моей программы и получаю ошибки выделения / освобождения памяти. Кажется, что в программе происходит сбой в деструкторе при попытке удалить указанный указатель c в векторе. Я ссылался на другой подобный пост (ссылка ниже кода), но не могу определить, является ли это проблемой, которую я делаю, или это библиотека Orocos KDL, пытающаяся освободить эту память.
#include "plog/Appenders/ColorConsoleAppender.h"
#include <kdl/frames.hpp>
#include <kdl_parser/kdl_parser.hpp>
#include <urdf/model.h>
#include <iostream>
#include <kdl/chain.hpp>
#include <kdl/chainfksolverpos_recursive.hpp>
#include <kdl/chainiksolverpos_lma.hpp>
#include <kdl/chainjnttojacsolver.hpp>
#include <kdl/tree.hpp>
#include <map>
#include <string>
#include <vector>
class ComputeKinematics
{
public:
ComputeKinematics(const std::string &file);
~ComputeKinematics();
private:
KDL::Tree urdfTree;
std::vector<KDL::Chain> KinematicChains;
std::vector<KDL::ChainFkSolverPos_recursive*> ForwardKinematicsSolvers;
std::vector<KDL::ChainIkSolverPos_LMA*> InverseKinematicsSolvers;
std::vector<KDL::ChainJntToJacSolver*> JacobianSolvers;
};
ComputeKinematics::ComputeKinematics(const std::string &file)
{
if(!kdl_parser::treeFromFile(file, urdfTree))
{
return;
}
const KDL::SegmentMap &segmentMap = urdfTree.getSegments();
std::vector<std::string> leafSegmentNames;
for (KDL::SegmentMap::const_iterator it = segmentMap.begin(); it != segmentMap.end(); it++)
{
if (0 == it->second.children.size())
{
leafSegmentNames.push_back(it->second.segment.getName());
}
}
for (unsigned long index = 0; index < leafSegmentNames.size(); index++)
{
KDL::Chain tempChain;
if (!urdfTree.getChain(urdfTree.getRootSegment()->first, leafSegmentNames[index], tempChain))
{
return;
}
KinematicChains.push_back(tempChain);
ForwardKinematicsSolvers.push_back(
new KDL::ChainFkSolverPos_recursive(KinematicChains[KinematicChains.size()-1]));
InverseKinematicsSolvers.push_back(
new KDL::ChainIkSolverPos_LMA(KinematicChains[KinematicChains.size()-1]));
JacobianSolvers.push_back(
new KDL::ChainJntToJacSolver(KinematicChains[KinematicChains.size()-1]));
}
return;
}
ComputeKinematics::~ComputeKinematics()
{
for (unsigned long index = 0; index < ForwardKinematicsSolvers.size(); index++)
{
if (nullptr != ForwardKinematicsSolvers[index])
{
delete ForwardKinematicsSolvers[index];
ForwardKinematicsSolvers[index] = nullptr;
}
}
for (unsigned long index = 0; index < InverseKinematicsSolvers.size(); index++)
{
if (nullptr != InverseKinematicsSolvers[index])
{
delete InverseKinematicsSolvers[index];
InverseKinematicsSolvers[index] = nullptr;
}
}
for (unsigned long index = 0; index < JacobianSolvers.size(); index++)
{
if (nullptr != JacobianSolvers[index])
{
delete JacobianSolvers[index];
JacobianSolvers[index] = nullptr;
}
}
}
int main()
{
std::string xmlFile = "robot.urdf";
ComputeKinematics(xmlFile.c_str());
return 0;
}