繁体   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