首页 > 解决方案 > 保持对其他类的成员函数的引用

问题描述

我有一个 A 类的实例,它应该在 B 类的另一个实例中注册一个成员回调。我试图在 B 类中保留对 A 类函数的引用,但我得到了一个 Segfault。

类A.h:

std::shared_ptr<classB> mB;
void toBeRegisteredCallback(const uint8_t val);

类A.cpp:


classA::classA(std::shared_ptr<classB> b) : 
mB(std::move(b)) {
  b->registerCallback(std::bind(&classB::toBeRegisteredCallback, this,
                                                      std::placeholders::_1));
}

void classB::toBeRegisteredCallback(const uint8_t val) {
  LOG(INFO) << "Received a value callback!";
}

这是classB.h的代码:

public:
    void registerCallback(std::function<void(const uint8_t val)> callback);
private:
    std::function<void(const uint8_t)> _callback;

这是classB.cpp的代码:

void classB::registerCallback(std::function<void(const uint8_t val)> callback) {
        _callback = callback;
}

当我尝试直接调用回调而不分配时,它工作正常: callback(8) 但是,如果我尝试分配它,我会在functionswap处得到一个段错误

谢谢。

标签: c++

解决方案


考虑你的classA构造函数......

classA::classA(std::shared_ptr<classB> b)
  : mB(std::move(b))
{
  b->registerCallback(std::bind(&classB::toBeRegisteredCallback, this,
                                                      std::placeholders::_1));
}

的初始化mB将调用(从这里(项目 10)) ...

shared_ptr( shared_ptr&& r ) noexcept;

从 r 移动构造一个 shared_ptr。构造完成后, *this 包含 r 先前状态的副本,r 为空且其存储的指针为 null

因此,在下面的声明中......

b->registerCallback(std::bind(&classB::toBeRegisteredCallback, this, std::placeholders::_1));

b实际上是一个空指针,导致未定义的行为。


推荐阅读