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

C++ 如何将现有对象推回到共享指针向量?,c++,smart-pointers,stdvector,C++,Smart Pointers,Stdvector,使用原始指针,我可以创建一个指针向量,并将地址向后推,如下所示: Entity objEntity; std::vector<Entity*> Entities; Entities.push_back(&objEntity); 如果我改为使用共享指针向量: std::vector<std::shared_ptr<Entity>> Entities; 。。。我怎么把地址推回去 据我所知,std::shared_ptr::reset用于将现有对象的地址

使用原始指针,我可以创建一个指针向量,并将地址向后推,如下所示:

Entity objEntity;
std::vector<Entity*> Entities;
Entities.push_back(&objEntity);
如果我改为使用共享指针向量:

std::vector<std::shared_ptr<Entity>> Entities;
。。。我怎么把地址推回去

据我所知,std::shared_ptr::reset用于将现有对象的地址分配给智能指针。我是否需要先创建一个临时指针,调用reset,然后将_向后推

std::shared_ptr<Entity> temp;
temp.reset(&objEntity);
Entities.push_back(temp);
您可以使用构造新的共享指针:

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构造对象,或者在创建共享指针时创建一个副本。

创建智能指针时,最好使用它们的std::make_*函数。vector::push_back对于右值引用重载,调用方式如下

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

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

为什么不使用push\u backmake\u sharedobjEntity?当使用push\u back时,将调用一个复制构造函数。@仅当向其传递左值引用时才关闭。如果希望它执行,请选择Boost.PolyCollection到智能指针向量它通常会赢,因为它会减少内存碎片,如果出于任何原因不能使用Boost,那么使用unique_ptr向量来消除双重间接寻址和共享_ptr的其他开销。我会接受这个答案,因为它向我解释了为什么我不应该做我试图做的事情。它需要这里要明确的是,第二个例子是错误的。另外,最好将实体实例创建到std::shared_ptr中,以确保在向量调整大小异常时将其清除。下面的make_shared示例也很好,但我们并不总是希望使用make_shared。