簡體   English   中英

如何將現有對象推回共享指針的向量?

[英]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);

創建智能指針時,最好使用其std::make_*函數。 vector::push_back重載了右值引用,像這樣調用它

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

因此將通過移動傳入的std::shared_ptr在向量中構造一個元素,因此,由於在此處修改了智能指針的控制塊,因此不會對性能造成任何影響。 還請注意, vector::emplace_back不能與std::make_shared一起使用,而只能與原始指針一起使用,為避免異常處理和簡潔起見,應避免使用它(通過傳遞原始指針需要在上手動創建Entity實例堆)。

您可以使用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構造對象,或者在創建共享指針時進行復制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM