共享指针的意外值[重复]
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<A>& obj : *vec2)
你是按值循环的,所以 100 的元素只存在很短的时间。你想要shared_ptr<A>& 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使用的注意事项(内存被重复析构,内存泄漏问题)