【问题标题】:The weak pointer example in The C++ Programming LanguageC++ 编程语言中的弱指针示例
【发布时间】:2018-04-07 17:12:22
【问题描述】:

试图理解 Stroustrup 的 TCPL(第 995 页,第 4 版)中 weak_ptr 的示例。我知道目标是在需要时获取共享指针(指向相邻的小行星)。示例代码为:

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?有人可以更详细地解释那条线吗?

【问题讨论】:

  • this 有帮助吗?

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


【解决方案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);
}

【讨论】:

  • 循环引用问题让人分心。真正的问题:“每个小行星都必须保留其附近其他小行星的列表。请注意,在这样的邻居列表中不应让小行星保持“活着”(因此 shared_ptr 是不合适的)。stroustrup.com/C++11FAQ.html#std-weak_ptr
【解决方案2】:

reset 函数相当于赋值运算符(=),不同之处在于赋值运算符将 shared_ptr 对象添加为 Asteroid 对象资产的共享所有者,增加它们的 use_count,而 reset() 函数使shared_ptr 获得 p 的所有权,使用次数为 1,使所有其他所有者释放其所有权。

因此,在这段代码中,reset 用于使 va[i] 成为当时对象的唯一所有者。

【讨论】:

    猜你喜欢
    • 2014-04-07
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    相关资源
    最近更新 更多