我在内存位置0x001AF0D0的main.exe:Microsoft C++异常:std::bad_weak_ptr中得到一个异常抛出:0x74AC4192。
在中
Gasstation::Gasstation(int n,int m)
{
for (int i = 0; i < n; ++i)
{
pumps_.push_back(std::make_shared<Pumplace>());
}
cashregisters_ = std::make_shared<Cashregister> (shared_from_this(), m);
}
我还在标题中使用了这个:
class Gasstation : public std::enable_shared_from_this<Gasstation>
可能是什么问题?
这里代码的问题是,您在类本身的构造函数中调用shared_from_this()
,严格来说,它还没有"共享"。构造函数在存在指向对象的智能指针之前被调用。按照您的示例,如果创建shared_ptr
到Gasstation
:
std::shared_ptr<Gasstation> gasStation = std::make_shared<Gasstation>(5,10);
//gasStation is available as a smart pointer, only from this point forward
enable_shared_from_this
的一个限制是不能在构造函数中调用shared_from_this
。
一种解决方案虽然不那么优雅,但却是使用一个公共方法来设置cashregisters_变量。该方法可以在构造后调用:
Gasstation::Gasstation(int n, int m)
{
for (int i = 0; i < n; ++i)
{
pumps_.push_back(std::make_shared<Pumplace>());
}
cashregisters_ = std::make_shared<Cashregsiter>(m);
}
Gasstation::initialise_cashregisters()
{
cashregisters_->set_gasstation(shared_from_this());
}
//driver code
std::shared_ptr<Gasstation> gasStation = std::make_shared<Gasstation>(5, 10);
gasStation->initialise_cashregisters();
此解决方案要求您记住每次初始化加油站时都要调用initialize_casregisters。
除此之外,你的选择是有限的,你可能不得不重新考虑你的设计。你有没有考虑过在收银台使用加油站的原始指针而不是智能指针?如果cashregister_是一个私有变量,并且在分配给它的加油站的使用寿命之外永远不会存在,那么使用原始指针可能是一个安全而优雅的选择。