试图理解Stroustrup的TCPL中的weak_ptr
示例(第995页,第4版)。我知道目标是在需要时抓住共享指针(到邻居小行星)。示例代码是:
void owner()
{
//...
vector<shared_ptr<Asteroid>> va(100);
for (int i = 0; i < va.size(); ++i) {
va[i].reset(new Asteroid(weak_ptr<Asteroid>(va[neighbor]))); // why?
}
}
很多东西都在标记的行中发生。我不明白为什么使用reset
,为什么构造函数接受weak_ptr
?有人可以更详细地解释这一行吗?
答案 0 :(得分:1)
解释专用行,Asteroid()
构造函数将接受weak_ptr
作为参数并返回shared_ptr
。 vector element va[i]
通过在接受新的shared_ptr之前调用reset
来放弃任何早期的所有权。
简化代码如下所示:每个新的Asteroid都有一个指向另一个相邻Asteroid的指针,该指针应该是一个weak_ptr,以避免由于互连Asteroid指针而引起的循环引用。
vector<shared_ptr<Asteroid>> va(100);
for (int i = 0; i < va.size(); ++i)
{
shared_ptr<Asteroid>sp = va[neighbor];
weak_ptr<Asteroid> wp = sp;
shared_ptr<Asteroid>sp2 = make_shared<Asteroid>(wp);
va[i].reset(sp2);
}
答案 1 :(得分:0)
reset
函数等同于赋值运算符(=),区别在于assign运算符将shared_ptr对象添加为Asteroid对象资产的共享所有者,增加了use_count,而reset()
函数使shared_ptr
获得p的所有权,使用次数为1,使所有其他所有者释放其所有权。
因此,在此代码中,reset
用于使va[i]
成为当时对象的唯一所有者。