在抛出 'std::bad_weak_ptr' 的实例后终止调用 what(): bad_weak_ptr?



我正在学习智能指针和shared_from_this。 在类继承关系中,将很难理解。

我有两个基类CACB,它们派生自enable_shared_from_this,子类CC派生自CACB。 我想从类自身中取出三个类共享指针,所以我写了sharedCAfromThissharedCBfromThissharedCCfromthis

class CA  : private enable_shared_from_this<CA> {
public:
shared_ptr<CA> sharedCAfromThis() { return shared_from_this();  }
virtual ~CA() {};
void print() {
cout << "CA" << endl;
}
};
class CB : private enable_shared_from_this<CB> {
public:
shared_ptr<CB> sharedCBfromThis() { return shared_from_this();  }
virtual ~CB() {};
void print() {
cout << "CB" << endl;
}
};
class CC : public CA, CB {
public:
shared_ptr<CC> sharedCCfromThis() { return dynamic_pointer_cast<CC>(sharedCAfromThis());  }
virtual ~CC() {};
void print() {
cout << "CC" << endl;
}
};
int main()
{
shared_ptr<CC> cc_ptr = make_shared<CC>();
cc_ptr->sharedCAfromThis()->print();
//shared_ptr<C> c_ptr = make_shared<C>();
//c_ptr->get_shared_b()->printb();
while (1);
}

但我错了,问题是:

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
terminate called after throwing an instance of 'std::bad_weak_ptr'
what():  bad_weak_ptr

为什么我会收到此错误消息?

嗨,是的,非常感谢,我将私有更改为公共,但问题仍然存在。 我的 GCC 版本是 8.0;我更改代码如下。

class CA  : public enable_shared_from_this<CA> {
public:
shared_ptr<CA> sharedCAfromThis() { return shared_from_this();  }
virtual ~CA() {};
void print() {
cout << "CA" << endl;
}
};
class CB : public enable_shared_from_this<CB> {
public:
shared_ptr<CB> sharedCBfromThis() { return shared_from_this();  }
virtual ~CB() {};
void print() {
cout << "CB" << endl;
}
};
class CC : public CA, CB, enable_shared_from_this<CC> {
public:
shared_ptr<CC> sharedCCfromThis() { return dynamic_pointer_cast<CC>(sharedCAfromThis());  }
virtual ~CC() {};
void print() {
cout << "CC" << endl;
}
};

你应该从enable_shared_from_this公开继承。 Per [util.smartptr.shared.const]/1:

在下面的构造函数定义中,启用shared_­from_­thisp对于Y*类型的指针p,表示如果Y具有 明确且可访问的基类,它是enable_­shared_­from_­this,那么remove_­cv_­t<Y>*应该是 隐式转换为T*,构造函数计算 陈述:

if (p != nullptr && p->weak_this.expired())
p->weak_this = shared_ptr<remove_cv_t<Y>>(*this, const_cast<remove_cv_t<Y>*>(p));

weak_­this成员的赋值不是原子的,并且冲突 对同一对象进行任何可能并发的访问 ([介绍多线程](。

如果使用私有继承,则无法再访问基类。

看起来你的问题是你有一个重复项。您需要确保只有一个enable_shared_from_this

要使用类来执行此操作,您可以虚拟派生类:

class A : virtual public enable_shared_from_this<A> ...
class B : virtual public enable_shared_from_this<B> ...
class C : public A, public B ...

现在,您有了enable_shared_from_this<>的单个实例,这应该按预期工作。否则,它可能会使用B中的版本,这可能是一个nullptr,因此会出现错误。

相关内容

  • 没有找到相关文章

最新更新