修改共享指针指向的对象的值

Modifying value of object pointed by a shared pointer

我最近开始使用共享指针,需要一些帮助。我有一个指向某些对象的共享指针的向量 1。我需要构造另一个指向相同对象的共享指针的向量 2,以便修改向量 2 会导致修改向量 2。 这是我的代码的样子: 这工作正常

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

int main()
{
    shared_ptr<A> ab = make_shared<A>(100);
    cout<< ab->print();
    
    shared_ptr<vector<shared_ptr<A>>> vec1 = make_shared<vector<shared_ptr<A>>>(1);
    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;   // Prints 100
    return 0;
}

但是这在最后一行给出了一个 SEGV,因为 vec1 没有被填充:

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);
    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;   // SIGSEGV
    return 0;
}

我想了解为什么 vec1 没有填充在第二个中,也想知道是否有任何其他方法可以做到这一点。谢谢!

评论中描述的设置代码可以是:

#include <vector>
#include <memory>
#include <iostream>
using namespace std;

struct A
{
    int a;
    A(int a): a(a) {}
};

int main()
{   
    auto p_vec1 = make_shared<vector<shared_ptr<A>>>();
    auto p_vec2 = make_shared<vector<shared_ptr<A>>>();

    for (int i = 0; i < 100; ++i)
        p_vec1->push_back( make_shared<A>(i) );

    for (int i = 0; i < 50; ++i)
        p_vec2->push_back( (*p_vec1)[i * 2] ); 
    
    (*p_vec1)[2]->a = 213;
    std::cout << (*p_vec2)[1]->a << '\n';    // print 213

    return 0;
}

如果你不知道,“外部”shared_ptr 是不必要的,你可以只使用两个向量。