繁体   English   中英

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

[英]How to push_back existing objects to a vector of shared pointers?

使用原始指针,我可以创建指针和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用于将现有对象的地址分配给智能指针。 我是否需要首先创建一个临时指针,调用reset,然后push_back?

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

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

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

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

您可以使用emplace_back构造一个新的共享指针:

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

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

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

为避免这种情况,您需要使用new构造对象,或者在创建共享指针时进行复制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM