c++ - 如何将现有对象 push_back 到共享指针 vector ?

标签 c++ smart-pointers stdvector

使用原始指针,我可以像这样创建一个指针 vector 和 push_back 地址:

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

如果我改为使用共享指针 vector :

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??

关于c++ - 如何将现有对象 push_back 到共享指针 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51133106/

相关文章:

c++ - 如果元素类型是基本类型,std::vector::resize() 是否向下花费 O(1) 时间?

C++ 存储在堆上保存在堆栈上

c++ - 为什么指针分配的内存在函数之后仍然存在,而不是数组?

c++ - 使用 std::map 从数组中删除重复项

c++ - 如何理解智能指针的底层指针地址?

c++ - 如何将 16 位 unsigned int 转换为 8 位 unsigned char 并最终返回 unsigned char*?

c++ - 从特定填充读取到 C++ 中的最后一行

c++ - 是否存在定时指针?

c++ - 智能指针和数组

c++ - 从 vector 中删除最后一个元素会导致迭代出现问题