“C ++编程语言”中的弱指针示例

时间:2018-04-07 17:12:22

标签: c++ shared-ptr weak-ptr

试图理解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?有人可以更详细地解释这一行吗?

2 个答案:

答案 0 :(得分:1)

解释专用行,Asteroid()构造函数将接受weak_ptr作为参数并返回shared_ptrvector 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]成为当时对象的唯一所有者。