Деструктор объекта shared_ptr никогда не вызывается - PullRequest
2 голосов
/ 31 октября 2019

Я создаю объект в главной функции как объект std :: shared_ptr и хочу сохранить некоторую информацию о нем в своем деструкторе. Однако я обнаружил, что деструктор объекта никогда не вызывается. Могу ли я вручную убедиться, что деструктор вызван? И кто-нибудь знает, почему деструктор никогда не вызывается? Это как-то связано с ros2?

Вот какой-то код: main.cpp:

#include "q_learner/q_learner_node.h"

int main(int argc, char * argv[])
{
    rclcpp::init(argc, argv);
    rclcpp::executors::MultiThreadedExecutor exec;
    auto q_learner_node = std::make_shared<q_learner::QLearnerNode>();`//This is the object that never gets destructed.
    exec.add_node(q_learner_node);
    exec.spin();
    rclcpp::shutdown();
    return 0;
}

И q_learner_node.cpp:

QLearnerNode::QLearnerNode() : rclcpp::Node("q_learner_node"){
    // ... some stuf ...
}
QLearnerNode::~QLearnerNode(){
    std::cout << "Destructor called" << std::endl;
    // ... some other stuff ...
}
// some more stuff

и q_learner_node.h:

class QLearnerNode : public rclcpp::Node
{
public:
QLearnerNode();
~QLearnerNode();

private:
// some more stuff
};

Или это проблема базового класса / дочернего класса?

РЕДАКТИРОВАТЬ:

Я не знал этого,Так что Google дал мне подсказку только сейчас:

Я использую "Ctrl + C", чтобы выйти из процесса в терминале. Однако rclcpp должен предоставить обработчик signal_handler для обработки этих сигналов. Это не похоже на работу для меня. Я все еще занимаюсь поиском, но любые намеки были бы отличными. Я обнаружил эту проблему с github 2018 года, но она не должна создавать проблем в моем коде (я думаю / надеюсь).

1 Ответ

0 голосов
/ 31 октября 2019

Я не знаю, что именно вызвало такое поведение, но после сброса рабочего пространства и построения всего с нуля все заработало ...

...