Ошибки сегментации общего указателя - как правильно разделить PlanningScene? - PullRequest
0 голосов
/ 26 апреля 2018

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 .

...