如何 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 用于将现有对象的地址分配给智能指针。是不是需要先创建一个临时指针,调用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
堆上的实例)。
使用原始指针,我可以创建一个指针向量和 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);
您可以使用 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
堆上的实例)。