c++ - 共享指针(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);
}
我也在标题中使用了这个:
class Gasstation : public std::enable_shared_from_this<Gasstation>
可能是什么问题呢?
解决方案
您的代码的问题在于您shared_from_this()
在类本身的构造函数中调用,严格来说,它还没有被“共享”。在对象的智能指针存在之前调用构造函数。按照您的示例,如果创建一个shared_ptr
to 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();
此解决方案将要求您记住每次初始化 Gasstation 时都调用 initialise_cashregisters。
除此之外,您的选择是有限的,您可能不得不重新考虑您的设计。您是否考虑过在 Cashregister 中使用指向 Gasstation 的原始指针而不是智能指针?如果 cashregister_ 是一个私有变量,并且在分配给它的 Gasstation 的生命周期之后永远不会存在,那么使用原始指针可能是一种安全而优雅的选择。
推荐阅读
- sql - 从登录时间和注销时间为不同行的表中计算持续时间
- google-apps-script - 在基于应用程序脚本的邮件合并中附加多个文件(动态和静态)
- c++ - 将原始指针与其拥有的 shared_ptr 一起缓存以获得更好的访问性能是一个好主意吗?
- flutter - 在 null 上调用了 getter 'documents'
- r - Rmarkdown 无法识别 kable_styling 命令中的内联
- python - HERE 请求如何为 params 中的键分配多个值
- node.js - 有没有办法忽略 Node.JS tls 中的自定义 CA 公用名?
- r - R - 有效地将列表列表的所有元素保存为 data.frame
- ruby-on-rails - 如何让活动作业永远重试所有作业?
- laravel - Laravel 建模系统