共享指针(this)
Shared pointer (this)
我在 main.exe 中遇到异常抛出:0x74AC4192:Microsoft C++ 异常:std::bad_weak_ptr 在内存位置 0x001AF0D0。
在
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);
}
我也在 header 中使用了这个:
class Gasstation : public std::enable_shared_from_this<Gasstation>
可能是什么问题?
此处代码的问题在于,您在 class 本身的构造函数中调用 shared_from_this()
,严格来说,它还没有 "made shared"。 在 存在指向对象的智能指针之前调用构造函数。以您的示例为例,如果创建 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
不能在构造函数中调用。
一个解决方案,虽然不是那么优雅,但是有一个 public 方法来设置 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();
此解决方案将要求您在每次初始化 Gasstation 时记住调用 initialise_cashregisters。
除此之外,您的选择是有限的,您可能不得不重新考虑您的设计。您是否考虑过在 Cashregister 中使用指向加油站的原始指针而不是智能指针?如果 cashregister_ 是一个私有变量,并且永远不会存在于分配给它的加油站的生命周期之外,那么使用原始指针可能是一种安全而优雅的替代方法。
我在 main.exe 中遇到异常抛出:0x74AC4192:Microsoft C++ 异常:std::bad_weak_ptr 在内存位置 0x001AF0D0。
在
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);
}
我也在 header 中使用了这个:
class Gasstation : public std::enable_shared_from_this<Gasstation>
可能是什么问题?
此处代码的问题在于,您在 class 本身的构造函数中调用 shared_from_this()
,严格来说,它还没有 "made shared"。 在 存在指向对象的智能指针之前调用构造函数。以您的示例为例,如果创建 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
不能在构造函数中调用。
一个解决方案,虽然不是那么优雅,但是有一个 public 方法来设置 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();
此解决方案将要求您在每次初始化 Gasstation 时记住调用 initialise_cashregisters。
除此之外,您的选择是有限的,您可能不得不重新考虑您的设计。您是否考虑过在 Cashregister 中使用指向加油站的原始指针而不是智能指针?如果 cashregister_ 是一个私有变量,并且永远不会存在于分配给它的加油站的生命周期之外,那么使用原始指针可能是一种安全而优雅的替代方法。