[英]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;
}
member
類中對team
的引用,以避免懸空引用問題。 我想我可以使用 std::shared_ptr 和 std::weak_ptr。 這樣做最安全的方法是什么?如果您添加線程,這個示例不會中斷(好吧,不比任何其他解決方案多)。 只要您正確保護對team
訪問,就可以了。
更改對std::shared_ptr
/ std::weak_ptr
引用會有問題。 您將需要在team
某種initialize()
函數,該函數將在其構造函數之后手動調用並在member
分配弱指針。 這是因為shared_from_this()
不能在構造函數中使用。
使用引用作為成員並不總是壞事,但有些人會對此不屑一顧。 一般來說,只要你能確保引用在類的整個生命周期內都是有效的,它就是安全的。
在這種情況下, team
和member
似乎是通過組合關系連接起來的,即member
只能存在於一個team
。 在這樣的設計中,參考構件很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.