ps_ptr
- это расширенный общий указатель на экземпляр PlanningScene , созданный с / boost::make_shared
. Класс PlanningScene объявлен как
class PlanningScene : private boost::noncopyable, public std::enable_shared_from_this<PlanningScene>
и включает метод clone
для "копирования" сцены планирования.
Эти определения намекают на то, что этот класс предназначен для совместного использования. Как правильно обходить ps_ptr
? Я хотел бы поделиться им с другим классом SceneStuff
, где SceneStuff
использует его только для вызова метода const ( PlanningScene :: checkCollision ).
Некоторые заметки:
- Использование
ps_ptr
как есть приводит к ошибкам сегмента из-за double free or corruption
. Это компилятор говорит мне, что я пытаюсь освободить память, которая уже была освобождена или была разыменована, но разве boost::shared_ptr
не должен это обрабатывать? Я прошел много SO-тем по этой теме, но безрезультатно.
- Я не могу позвонить
auto new_ps_ptr = ps_ptr->clone(ps_ptr);
, потому что no matching function for call to ‘planning_scene::PlanningScene::clone(boost::shared_ptr<planning_scene::PlanningScene>&)’
- повышение умных указателей документов
ОБНОВЛЕНИЕ : Благодаря комментарию Игоря я переключил ps_ptr
на std::shared_ptr
, но иногда по-прежнему получаю ошибки сегмента из-за следующего кода (дополнительно вызывается SceneStuff
) C
// Setup collision-models
auto robot_model_ptr = ps_ptr->getRobotModel();
collision_detection::CollisionRobotFCL crobot(robot_model_ptr);
auto world_ptr = ps_ptr->getWorldNonConst();
collision_detection::CollisionWorldFCL cworld(world_ptr);
// Just standard structs
auto dreq = collision_detection::DistanceRequest();
auto dres = collision_detection::DistanceResult();
// Compute obstacle distances for the given `conf`
moveit::core::RobotState query_state = ps_ptr->getCurrentState();
query_state.setVariablePositions(x.data()); // x is simply an Eigen::VectorXd
cworld.distanceRobot(dreq, dres, crobot, query_state);
Вот соответствующий источник:
ОБНОВЛЕНИЕ 2 : Похоже, что оставшиеся ошибки сегмента произошли из-за восходящей проблемы с передачей указателя PlanningScene через привязки Boost Python - см. этот вопрос SO .