[英]Shared pointer (this)
我在 main.exe 中有一個異常 throw:0x74AC4192:Microsoft C++ 異常:std::bad_weak_ptr 在 memory 位置 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 shared_from_this()
,嚴格來說,它還沒有被“共享”。 在指向 object 的智能指針存在之前調用構造函數。 按照您的示例,如果為Gasstation
創建shared_ptr
:
std::shared_ptr<Gasstation> gasStation = std::make_shared<Gasstation>(5,10);
//gasStation is available as a smart pointer, only from this point forward
它是shared_from_this
的一個限制, enable_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 的生命周期之后永遠不會存在,那么使用原始指針可能是一種安全而優雅的選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.