共享指针的意外值[重复]

Posted

技术标签:

【中文标题】共享指针的意外值[重复]【英文标题】:Unexpected value of a shared pointer [duplicate] 【发布时间】:2021-09-04 11:55:05 【问题描述】:

我最近开始学习共享指针,需要一些帮助。

#include <bits/stdc++.h>
using namespace std;

class A

    public:
    int a;
    A (int x) 
      a = x;
    
    int print() 
        return a;
    
;

int main()
   
    shared_ptr<vector<shared_ptr<A>>> vec1 = make_shared<vector<shared_ptr<A>>>(1);
    (*vec1)[0] = make_shared<A>(50);
    shared_ptr<vector<shared_ptr<A>>> vec2 = make_shared<vector<shared_ptr<A>>>();
    vec2->push_back((*vec1)[0]);
    for (shared_ptr<A>& obj : *vec2) 
        obj = make_shared<A>(100);
    
    cout << (*((*vec1)[0])).a;
    return 0;

这给出了 50 的输出,而我预计它是 100。有人可以解释一下原因吗?我该怎么做才能把它变成 100?蒂亚!

【问题讨论】:

试试for (shared_ptr&lt;A&gt;&amp; obj : *vec2) 你是按值循环的,所以 100 的元素只存在很短的时间。你想要shared_ptr&lt;A&gt;&amp; obj 谢谢!改变了它,但仍然得到输出为 50 您的新代码正在更改 vec2 的值(并且不再与 vec1 共享该值,因为 make_shared 将其替换为不同的共享),但您正在打印 @ 中的值987654327@。您可以使用 *obj = 100; 将它们的 shared 值更改为 100。 谢谢,这成功了!有没有其他方法可以使用共享指针而不是使用原始指针? 【参考方案1】:
for (shared_ptr<A> obj : *vec2) 
    obj = make_shared<A>(100);

这使得共享指针 obj 指向同一个对象 A50。然后共享指针 obj 被重置为指向新对象 A100,但原来的共享指针 vec2[0] 一直指向第一个对象 A50。

【讨论】:

谢谢!改变了它,但仍然得到输出为 50 你重置了vec2的元素,为什么输出的是vec1的元素?

以上是关于共享指针的意外值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

活动关闭时共享首选项空指针异常[重复]

将函数指针保存在共享内存中

如何解决由于强制展开导致的致命意外零错误[重复]

[C++11]shared_ptr使用的注意事项(内存被重复析构,内存泄漏问题)

在获取 PHAsset 路径时展开可选值时意外发现 nil [重复]

删除智能指针的内存释放不起作用[重复]