簡體   English   中英

共享指針(this)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM