如何在一个容器中正确实例化一个对象并将 shared_ptr 存储到一个单独的容器中?

How to properly instantiate an object in one container and store a shared_ptr to it in a separate container?

假设我们有一个结构或 class 存储一些数据:

struct Foo
{
    int bar;
}

还假设我想存储两个单独的向量;一个包含 Foo 的实际实例和一个 shared_ptr 的向量,它允许我任意访问该数据:

std::vector<Foo> data; // Where the data actually is

std::vector<std::shared_ptr<Foo>> ptr_data; // A set of pointers to the elements in data

如何将一个元素插入 data 向量,然后添加指向该元素的相应 shared_ptr 我想要data 向量中只存在实际数据的副本。

我不相信我可以使用 make_shared,因为我似乎找不到任何关于如何控制 数据存储位置的文档。当函数超出范围时,不应该收集匿名数据吗?

void addDataToVectors() 
{
    ptr_data.push_back(std::make_shared<Foo>( 20 )); // Can I put this into the data vector?
    // And shouldn't the data disappear as soon as this function ends?
}

我也试过这个:

void addDataToVectors() 
{
    data.push_back({ 20 }); // Add the instance to data
    // Attempt to create a shared pointer from the last address in data
    ptr_data.push_back(std::shared_ptr<Foo>(&data.back())); 
}

但这似乎不起作用。第一组数据及其指针的添加是正确的,但 ptr_data 向量中的每个后续 push_back 似乎都破坏了除最后一个之外的所有条目。这种方法显然有问题,一开始感觉很乱。

对 STL 容器执行此操作的正确方法是什么?

A shared_ptr 不是 的意思是“指向由其他人管理的对象”。 shared_ptr 表示“指向一个对象,当指向它的最后一个 shared_ptr 消失时,该对象将被删除。” vector 拥有它的元素。 shared_ptr 拥有它指向的内容。一个对象不能有两个所有者,除非这些所有者有预先安排的合作协议,共享指针彼此之间有。

如果您想要 std::vector<Foo> data,则将原始指针(或引用)传递给它的元素,但需要注意的是,如果 vector 是,这些指针(或引用)可能会变得无效修改的。这种方法不是目前最安全的方法,但在某些情况下,它已经足够好了。 或者,如果从未从 data 中删除元素,那么您可以将索引传递给 data 而不是指针。

如果你想 std::vector<std::shared_ptr<Foo>> ptr_data 然后在每个声明这些对象的容器中使用共享指针或弱指针。也就是说,data 也将是 shared_ptrs 的向量。

void addDataToVectors() 
{
    auto ptr = std::make_shared<Foo>(20);
    data.push_back(ptr);
    ptr_data.push_back(ptr);
}

如果你玩混搭,那你还不如玩气拼。