【问题标题】: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。
  • 谢谢,这成功了!有没有其他方法可以使用共享指针而不是使用原始指针?

标签: c++ c++11 c++17 shared-ptr smart-pointers


【解决方案1】:
for (shared_ptr<A> obj : *vec2) {
    obj = make_shared<A>(100);
}

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

【讨论】:

  • 谢谢!改变了它,但仍然得到输出为 50
  • 你重置了vec2的元素,为什么输出的是vec1的元素?
猜你喜欢
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 2019-12-31
相关资源
最近更新 更多