首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++编程语言中的弱指针示例

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

Stack Overflow用户
提问于 2018-04-08 01:12:22
回答 2查看 694关注 0票数 2

尝试理解Stroustrup的TCPL中的weak_ptr示例(第995页,第4版)。我理解这样做的目的是在需要的时候获取一个共享指针(指向邻近的小行星)。示例代码如下:

代码语言:javascript
复制
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?有人能更详细地解释一下这一行吗?

EN

回答 2

Stack Overflow用户

发布于 2018-04-08 01:33:42

解释指定行时,- Asteroid()构造函数将接受weak_ptr作为参数并返回shared_ptr。在接受新的shared_ptr之前,vector element va[i]通过调用reset放弃了任何先前的所有权。

简化的代码看起来像这样:每个新的小行星都会有一个指向另一个相邻小行星的指针,这个指针应该是一个weak_ptr,以避免由于相互连接的小行星指针而导致的循环引用。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-04-08 01:54:55

reset函数等同于赋值运算符(=),不同之处在于赋值运算符将shared_ptr对象添加为小行星对象资产的共享所有者,从而增加其use_count,而reset()函数使shared_ptr以使用计数1获取p的所有权,使所有其他所有者释放其所有权。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49709885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档