如何将现有对象push_back到共享指针的向量?
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 用于将现有对象的地址分配给智能指针。是否需要先创建临时指针,调用重置,然后再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
实例(。
相关文章:
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 嵌套类、继承和C++中的共享指针
- 制作一对共享指针并推送一个向量
- 如何将共享指针用作函数参数
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 尝试通过共享指针使用变量时读取访问冲突
- 如何将元素插入到标准::地图的共享指针中?
- 共享指针生存期
- 初始化可变数据结构中的共享指针向量
- 阻止在返回时复制共享指针