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

2022-08-23 00:00:00 c++ stdvector smart-pointers

使用原始指针,我可以创建指针和Push_Back地址的矢量,如下所示:

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

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

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

.如何推送地址?

据我所知,使用std::Shared_PTR::Reset是为了将现有对象的地址分配给智能指针。我是否需要先创建一个临时指针,然后调用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??

相关文章