如何将现有对象push_back到共享指针的向量?

How to push_back existing objects to a vector of shared pointers?

本文关键字:共享 指针 向量 back push 对象      更新时间:2023-10-16

使用原始指针,我可以创建一个指针向量并push_back地址,如下所示:

Entity objEntity;
std::vector<Entity*> Entities;
Entities.push_back(&objEntity);

如果我改用共享指针的向量:

std::vector<std::shared_ptr<Entity>> Entities;

。如何push_back地址?

据我了解,std::shared_ptr::reset 用于将现有对象的地址分配给智能指针。是否需要先创建临时指针,调用重置,然后再push_back?

std::shared_ptr<Entity> temp;
temp.reset(&objEntity);
Entities.push_back(temp);

您可以使用emplace_back从现有指针构造新的共享指针:

Entity* entity = new Entity;
std::vector<std::shared_ptr<Entity>> Entities;
Entities.emplace_back(entity);

或者,您可以使用push_back来构造带有make_shared的对象。

Entities.push_back(std::make_shared<Entity>());

无法安全地添加现有对象(一开始不是作为指针创建的(。您可以添加现有指针,也可以在创建共享指针时创建副本。

如果添加现有对象的地址,您将尝试释放内存两次,因为共享指针的析构函数会销毁该对象:

Entity entity;
std::vector<std::shared_ptr<Entity>> Entities;
Entities.emplace_back(&entity); // incorrect usage
// What happens when entity and shared pointer both go out of scope??

创建智能指针时,最好使用它们的std::make_*函数。vector::push_back重载了右值引用,像这样调用它

Entities.push_back(std::make_shared<Entity>());

因此,将通过移动您传入的std::shared_ptr在向量中构造一个元素,因此由于在此处修改智能指针的控制块,不会降低性能。另请注意,vector::emplace_back不能与std::make_shared一起使用,而只能与原始指针一起使用,为了异常处理和简洁起见,应避免使用原始指针(传递原始指针需要在堆上手动创建Entity实例(。