抛出“std::bad_weak_ptr”实例后调用终止

问题描述 投票:0回答:1

我有两节课。我想将

this
从一个类的构造函数作为参数传递给另一个类的构造函数。

我知道发生错误是因为在 IkArm 对象(this)完全构造之前调用了shared_from_this()。但我无法找到在执行第一个类后将节点传递给第二个类的方法。我也经历过this问题,但那里使用的类的关系是不同的。

以下是代码:

#include "rclcpp/rclcpp.hpp"

class IkSolver
{
    public:
        IkSolver(std::shared_ptr<rclcpp::Node> node) : node_(node)
        {
            RCLCPP_INFO(node_->get_logger(), "2nd Constructor");                
        }

    private:
        std::shared_ptr<rclcpp::Node> node_;
};

class IkArm : public rclcpp::Node
{
    public:
        IkArm() : Node("IkNode")
        {
            RCLCPP_INFO(this->get_logger(), "1st Constructor");
            
            obj1_ = std::make_shared<IkSolver>(shared_from_this());
            RCLCPP_INFO(this->get_logger(), "Back To 1st Constructor");
        }

    private:
        std::shared_ptr<IkSolver> obj1_;
};


int main(int argc, char * argv[])
{
    rclcpp::init(argc, argv);
    rclcpp::spin(std::make_shared<IkArm>());
    rclcpp::shutdown();
    return 0;
}

我收到以下错误:

[INFO] [1720452645.004303274] [IkNode]: 1st Constructor
terminate called after throwing an instance of 'std::bad_weak_ptr'
  what():  bad_weak_ptr
[ros2run]: Aborted

c++
1个回答
0
投票

你不能从构造函数调用

shared_from_this
,你只能在已经绑定到
shared_from_this
的对象上调用
shared_ptr
,该对象在其构造函数完成后绑定到
shared_ptr

来自 std::enable_shared_from_this

仅允许在先前共享的对象上调用shared_from_this 对象,即由 std::shared_ptr 管理的对象。否则, std::bad_weak_ptr 被抛出(由来自 a 的 shared_ptr 构造函数 默认构造的weak-this)。

您需要将成员的构造放在您调用的另一个方法中在构造函数之外

rclcpp::spin(std::make_shared<IkArm>()->init());

// init implemenation
std::shared_ptr<IkArm> init()
{
    obj1_ = std::make_shared<IkSolver>(shared_from_this());
    return shared_from_this();
}
© www.soinside.com 2019 - 2024. All rights reserved.