簡體   English   中英

用 std::shared_ptr 和 std::weak_ptr 替換引用存儲

[英]Replace references storage with std::shared_ptr and std::weak_ptr

我有一個簡單的案例,我知道如果我開始使用線程,事情可能會出錯。 神馬在這里

#include <iostream>
#include <memory>

class team;

class member
{
    public:
    member(team& my_team) : my_team(my_team) {
        std::cout << "ctor" << std::endl;
    }

    ~member(){
        std::cout << "dtor" << std::endl;
    }

    void modify_my_team()
    {
        //here I want to make sure team is still a valid reference
    }

    private:
    team& my_team;
};

class team
{
    member m1{*this};
    member m2{*this};
    member m3{*this};
};

int main()
{
    team t;
    return 0;
}
  1. 在這個例子中,我想刪除member類中對team的引用,以避免懸空引用問題。 我想我可以使用 std::shared_ptr 和 std::weak_ptr。 這樣做最安全的方法是什么?
  2. 存儲引用總是不好的嗎?

如果您添加線程,這個示例不會中斷(好吧,不比任何其他解決方案多)。 只要您正確保護對team訪問,就可以了。

更改對std::shared_ptr / std::weak_ptr引用會有問題。 您將需要在team某種initialize()函數,該函數將在其構造函數之后手動調用並在member分配弱指針。 這是因為shared_from_this()不能在構造函數中使用。

使用引用作為成員並不總是壞事,但有些人會對此不屑一顧。 一般來說,只要你能確保引用在類的整個生命周期內都是有效的,它就是安全的。
在這種情況下, teammember似乎是通過組合關系連接起來的,即member只能存在於一個team 在這樣的設計中,參考構件很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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