使用原始指针,我可以像这样创建指针和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);
答案 0 :(得分:6)
创建智能指针时,最好使用它们的std::make_*
函数。 vector::push_back
对于右值引用超载,以这种方式调用
Entities.push_back(std::make_shared<Entity>());
因此将通过移动传入的std::shared_ptr
在向量中构造一个元素,因此,由于在此处修改了智能指针的控制块,因此不会对性能造成任何影响。还请注意,vector::emplace_back
不能与std::make_shared
一起使用,而只能与原始指针一起使用,为避免异常处理和简洁起见,应避免使用该指针(传递原始指针需要手动创建{ {1}}实例)。
答案 1 :(得分:5)
您可以使用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
构造对象,或者在创建共享指针时进行复制。