如何在一个容器中正确实例化一个对象并将 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_ptr
s 的向量。
void addDataToVectors()
{
auto ptr = std::make_shared<Foo>(20);
data.push_back(ptr);
ptr_data.push_back(ptr);
}
如果你玩混搭,那你还不如玩气拼。
假设我们有一个结构或 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_ptr
s 的向量。
void addDataToVectors()
{
auto ptr = std::make_shared<Foo>(20);
data.push_back(ptr);
ptr_data.push_back(ptr);
}
如果你玩混搭,那你还不如玩气拼。